使用" \ b"在.NET正则表达式中

时间:2016-07-22 15:01:46

标签: c# .net regex

有人可以解释为什么结果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

1 个答案:

答案 0 :(得分:6)

不确定。您的\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])(请注意这里的双重否定,因为前瞻和后瞻只能是负数,因此它们也可以在字符串的开头和结尾处起作用)。