为什么边界在正则表达式括号中不起作用?

时间:2019-05-22 22:40:28

标签: c# regex

首先,我想指出similar question存在与PHP特定的答案和解决方法。我在C#中看到了这个问题,我想了解这个明显的“陷阱”背后的逻辑。

将单词边界字符\b放在Regex集内(也称为“方括号”:[])时,似乎无法正常工作。这是一个语法问题,还是有意将单词边界排除在集合匹配之外,还是我缺少其他解释?

这是一个演示该问题的程序:

namespace TestProgram
{
    using System.Text.RegularExpressions;
    using System.Diagnostics;
    class Program
    {
        static void Main(string[] args)
        {
            var text = "[abc]";
            var BaselineRegex = new Regex(@"(?:\b)(abc)");
            Debug.Assert(BaselineRegex.IsMatch(text)); // Assertion Passes
            var BracketRegex = new Regex(@"(?:[\b])(abc)");
            Debug.Assert(BracketRegex.IsMatch(text)); // Assertion Fails!
        }
    }
}

以下是要演示的网络版本:

  • 单词边界按预期表现,不带括号:(link

  • 放置在方括号(link)中的单词边界不匹配

1 个答案:

答案 0 :(得分:0)

引用Wiktor Stribiżew's comment

  

[\b]是一个退格字符匹配模式,仅此而已。

因此,尽管\b是字符类外部的零宽度单词边界,但在字符类中使用时,它指的是退格字符(ASCII中的0x8)。 this post中提供了更多详细信息。

维克多:如果您想发表自己的答案,我很乐意接受这一答案。