很简单的正则表达式不起作用

时间:2010-03-30 11:11:59

标签: c# .net regex string

我有read使用正则表达式(在.NET中)匹配字符串内的单词,我可以在正则表达式中使用单词边界说明符(\b)。但是,这些调用都不会导致任何匹配

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\b@p1\b");

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b");

我有什么问题吗?

编辑:第二个已经在运行;)

3 个答案:

答案 0 :(得分:10)

更新:正如another answer指出的那样,@不是单词字符,因此@和空格之间没有单词边界。作为解决方法,您可以使用negative lookbehind

@"(?<!\w)@p1\b"

原始回答:您需要在正则表达式前面加@

@"\b@p1\b"

如果没有这个,字符串“\ b”将被解释为退格(字符8),而不是正则表达式字边界。有关MSDN上@-quoted string文字的更多信息。

不使用@ -quoted字符串文字的另一种方法是转义反斜杠:

"\\b@p1\\b"

答案 1 :(得分:4)

第二种情况由@"\bINSERT\b"解决,如另一个答案中所述。

但是/b匹配:

  • 在第一个角色之前 string,如果第一个字符是a 字符。
  • 在最后一个角色之后 string,如果最后一个字符是a 字符。
  • 字符串中的两个字符之间, 其中一个是单词字符和 其他不是一个字符。

单词字符是[a-zA-Z0-9_]之一,因此第一种情况无法通过为@添加前缀来解除\b字符,因为您尝试匹配非单词字符({ {1}})。


<强>更新 第一种情况可以通过负面的后置断言来解决,但也可以通过使用否定的单词边界@来解决,这会产生更清晰的语法(\B)。

答案 2 :(得分:1)

\在您的字符串中被转义 - 您需要使用string literals来避免这种情况:

@"\bINSERT\b"

否则正则表达式会看到"bINSERTb"