【问题标题】:Using "\b" in a .NET regex [duplicate]在 .NET 正则表达式中使用“\b”[重复]
【发布时间】:2016-07-22 23:14:52
【问题描述】:

谁能解释一下为什么结果 1,2 和 3 是错误的?看起来像一个微不足道的问题.. 但我还是被卡住了:/

        string input = "foo abc defg bar";
        string pattern = "abc defg";

        string pattern1 = "\b" + Regex.Escape(pattern) + "\b";
        string pattern2 = "\b" + pattern + "\b";
        string pattern3 = "\babc defg\b";
        string pattern4 = pattern;


        bool result1 = Regex.IsMatch(input, pattern1); // FALSE
        bool result2 = Regex.IsMatch(input, pattern2); // FALSE
        bool result3 = Regex.IsMatch(input, pattern3); // FALSE
        bool result4 = Regex.IsMatch(input, pattern4); // TRUE

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    当然。您的\b 实际上是退格字符,而不是正则表达式\b。您需要使用 "\\b" 将其嵌入到 C# 字符串文字中,或者使用逐字字符串文字:@"\b"

    记住:反斜杠是 C# 字符串的转义字符,就像它是正则表达式一样,所以如果你不小心,你需要转义两次,一次用于字符串文字,一次用于正则表达式。

    另一件事:远离\b,与\w 相同。 \b 是根据\w 定义的锚点,\w 是一个字符类,除了快速的一次性任务外,您可以非常严格地控制要匹配的所有内容。 \b 仅表示锚点的一侧是匹配\w 的字符,而另一侧则没有(字符串结尾或匹配\W 的字符)。现在,\w 包括数字和_ 之类的东西。如果您搜索模糊的类似单词的东西,至少 倾向于不将数字和下划线视为单词的一部分。通常我喜欢明确说明我正在寻找的东西,例如通过环视断言:(?<!\p{L}) 是一种指定匹配中当前点之前没有 字母 的方法,实际上是在模式开始处替代 \b。同样(?!\p{L}) 可用于模式末尾的\b。像这样编写它们时,您可以更好地控制您认为适合您正在寻找的东西的“边界”,例如也许您只想在foo 以空格为界时找到它:(?<![^\S])foo(?![^\S])(请注意这里的双重否定,因为前瞻和后瞻只能是负数,因此它们也适用于字符串的开头和结尾)。

    【讨论】:

    • 啊,当然!我以为我在某个地方犯了一个愚蠢的错误。谢谢!
    • 也感谢“另一件事”!这是有道理的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2011-05-05
    • 2016-10-24
    相关资源
    最近更新 更多