2011-08-10 157 views
10

如果不包含方括号,我必须解析文本,其中是关键字。我必须将关键字相匹配。此外,在的两边都必须有字边界。正则表达式匹配不包围括号的字符串

下面是一些例子,其中不是关键字:

  • [与]
  • [与]
  • [sometext与sometext]
  • [sometext与]
  • [with sometext]

下面是一些例子,其中 IS关键字

  • ]与
  • 你好与
  • 你好与世界
  • 你好[世界]与喂
  • 你好[世界]跟你好[世界]

无论如何他的LP? 在此先感谢。

回答

17

你可以查找单词with,看到最接近支架的左侧是不是一个开放支架,而最接近的支架其右侧是不是一个右括号:

Regex regexObj = new Regex(
    @"(?<!  # Assert that we can't match this before the current position: 
    \[  # An opening bracket 
    [^[\]]* # followed by any other characters except brackets. 
    )   # End of lookbehind. 
    \bwith\b # Match ""with"". 
    (?!  # Assert that we can't match this after the current position: 
    [^[\]]* # Any text except brackets 
    \]  # followed by a closing bracket. 
    )   # End of lookahead.", 
    RegexOptions.IgnorePatternWhitespace); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    // matched text: matchResults.Value 
    // match start: matchResults.Index 
    // match length: matchResults.Length 
    matchResults = matchResults.NextMatch(); 
} 

的周围的表情并不止于换行;如果您希望单独评估每条生产线,请使用[^[\]\r\n]*而不是[^[\]]*

+0

@Tim:你的解决方案真的帮了我很多。现在我有类似的问题,只是,括号将被替换为引号。我的意思是''有一些文字的文字“'不是关键字。我试图用引号替换括号,但它不起作用。在Regex中我真的很糟糕,我需要你的帮助。谢谢:) – Mohayemin

+0

@Mohaimin,看看[这个问题](http://stackoverflow.com/questions/6111749/replace-whitespace-outside-quotes-using-regular-expression/6112179#6112179)这是一个非常相似问题;只需用'\ bwith \ b'替换正则表达式中的'[\]'部分,你应该很好走。 –

+0

@Tim:谢谢,那很完美。我只需要稍作修改,因为我必须将引用正则表达式与上面给出的正则表达式合并。它工作得很好:D – Mohayemin

0

你会想看看负面的后视和负面的前瞻,这将帮助你匹配你的数据,而不消耗括号。

3

不错的问题。我认为找到适用于您的[with]模式的匹配会比较容易,然后反转结果。

您需要匹配[,后面没有],接着with(然后用于闭合方括号的相应图案)

选配[with是容易的。

\[with 

添加先行排除],并且还允许任何数目的其它字符(.*

\[(?!]).*with 

那么相应的关闭方括号,即具有反向预搜索相反。

\[(?!]).*with.*\](?<1[) 

多一点调整

\[(?!(.*\].*with)).*with.*\](?<!(with.*\[.*)) 

,现在如果你反了,你应该有你想要的结果。 (即,当这返回'真',你的模式匹配,并希望排除这些结果)。

1

我认为最简单的解决方案是抢先匹配平衡的括号及其内容对,以便在您搜索关键字时将它们排除在外。这里是一个例子:

string s = 
    @"[with0] 
    [ with0 ] 
    [sometext with0 sometext] 
    [sometext with0] 
    [with0 sometext] 


    with1 
    ] with1 
    hello with1 
    hello with1 world 
    hello [ world] with1 hello 
    hello [ world] with1 hello [world]"; 

Regex r = new Regex(@"\[[^][]*\]|(?<KEYWORD>\bwith\d\b)"); 
foreach (Match m in r.Matches(s)) 
{ 
    if (m.Groups["KEYWORD"].Success) 
    { 
    Console.WriteLine(m.Value); 
    } 
} 
+0

Upvoting这个,不错的一个艾伦。 :)不管你信不信,我只看到了其他三个使用这种技术的问题,尽管看到了许多类似的问题。 – zx81