使用“;”;在.NET正则表达式中

本文关键字:正则表达式 NET 使用 | 更新日期: 2023-09-27 17:58:11

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

使用“;”;在.NET正则表达式中

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

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

另一件事:远离'b,与'w一样。'b是根据'w定义的锚点,而'w是一个字符类,除了快速一次性任务之外,它对任何事情都毫无用处,在这些任务中,您可以非常严格地控制想要匹配的所有内容。'b简单地意味着锚的一侧是与'w匹配的字符,而另一侧没有(字符串的末端或与'W匹配的字符)。现在,'w包括数字和_。如果你搜索模糊的类似单词的东西,至少倾向于不认为数字和下划线是单词的一部分。通常,我喜欢明确它实际上是我想要的东西,例如通过环视断言:(?<!'p{L})是一种指定在匹配的当前点之前没有字母的方式,它实际上是模式开始时'b的替代品。类似地,CCD_ 17可以用于图案末尾的CCD_ 18。当你这样写它们时,你可以更好地控制你认为适合你要找的东西的"边界",例如,也许你只想在foo被空白包围时找到它:(?<![^'S])foo(?![^'S])(注意这里的双负,因为先行和后向只能是负的,所以它们也在字符串的开头和结尾工作)。