【问题标题】:Very simple regex not working非常简单的正则表达式不起作用
【发布时间】:2011-02-02 10:20:16
【问题描述】:

我有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");

是不是我做错了什么?

编辑:第二个已经开始工作了;)

【问题讨论】:

    标签: c# .net regex string


    【解决方案1】:

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

    但是/b 匹配于:

    • 在第一个字符之前 字符串,如果第一个字符是 单词字符。
    • 在最后一个字符之后 字符串,如果最后一个字符是 单词字符。
    • 在字符串中的两个字符之间, 其中一个是单词字符,而 other 不是单词字符。

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


    更新: 第一种情况可以通过否定的后视断言解决,也可以通过使用否定词边界\B 来解决,这会产生更清晰的语法(@"\B@p1\b")。

    【讨论】:

    • 哦,感谢您指出这一点;)有什么办法可以克服吗?
    • @Thomas Wanner,您可以使用正则表达式 Lookbehind Zero-Width Assertions。检查 Mark Byers 答案以获取解决方案。
    • 应该写 \b 而不是上面的 /b 在“但是...”
    【解决方案2】:

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

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

    原答案:您需要在正则表达式前加上@

    @"\b@p1\b"
    

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

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

    "\\b@p1\\b"
    

    【讨论】:

      【解决方案3】:

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

      @"\bINSERT\b"
      

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

      【讨论】:

      • 刚刚遇到这个问题,在我的各种外部 RegEx 测试器中一切正常;只是不在我的代码中-我忘记了@。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2021-05-06
      相关资源
      最近更新 更多