或改变词边界的行为

时间:2012-08-26 15:45:48

标签: .net regex c#-4.0

在第一个Debug下面返回'unsbuscrib''d,第二个返回unsbuscrib'。区别在于领先'。

我希望两者都能返回unsbuscrib''d。

    string textText = " 'unsbuscrib''d' ";
    Regex rTest = new Regex(@"\b(ab)|(['\w]+)\b");
    if (rTest.IsMatch(textText))
    {
        Debug.WriteLine(rTest.Match(textText).Value);
    }
    rTest = new Regex(@"\b(['\w]+)\b");
    if (rTest.IsMatch(textText))
    {
        Debug.WriteLine(rTest.Match(textText).Value);
    }

修复是@“\ b((ab)|(['\ w] +))\ b”感谢Guffa

2 个答案:

答案 0 :(得分:1)

这是因为第一个正则表达式与\b(ab)(['\w]+)\b匹配。

它将在开头包含撇号,因为它使用第二部分,其中开头不需要单词边界。

第二个正则表达式在开头需要一个单词边界,空格和撇号之间没有单词边界。第一个单词边界位于撇号和字母u之间。

答案 1 :(得分:0)

\b word boundary匹配字母数字字符和非alnum字符,因此它在'u之间匹配,但在<space>之间不匹配'

你的交替将第一个正则表达式分成

\b(ab)   |   (['\w]+)\b

也许你的意思是

\b(?:(ab)|(['\w]+))\b