在正则表达式中,(\ W | $)是\ b的可行替代方案吗?

时间:2011-06-17 18:25:43

标签: c# regex

我们有一个客户端应用程序,用户希望在其中搜索指定文本的“注释”字段。字段使用HTML或纯文本格式化。我们最近的一个变化是仅支持“全字”匹配。使用\b,我们实现了这一点。图案:

"\b(?:match)\b" <-- works

新的一天,新问题:他们想要找到的一个值是一个数字,后跟一个百分号。 (%)但是,模式不匹配。经过一些研究,我能够确定,对于位置 n 的字符被视为字尾边界,\b断言位置 n处的字符 - 1 必须是单词字符。但是,%不是单词字符,因此匹配失败。

"\b(?:7.0%)\b" <-- fails

我将其更改为匹配\W,并且它有效,但这样做的缺点是匹配模式后必须始终有另一个字符。

"\b(?:7.0%)\W" <-- works, mostly

所以我想知道的是,我可以使用以下作为模式并使其匹配字符串结尾匹配吗?

"\b(?:7.0%)(\W|$)" <-- ??

我测试了它并出现工作,但有什么东西会让我在路上咬我吗?

编辑:

这是一个快速测试工具,演示了不同的行为,包括来自agent-j的答案:

        List<string> testInputs = new List<string>();

        testInputs.Add("This string contains 7.0% embedded within it.");
        testInputs.Add("In this string, 7.0%\nis at the end of a line.");
        testInputs.Add("7.0% starts this string.");
        testInputs.Add("This string ends with 7.0%");

        List<string> testPatterns = new List<string>();
        testPatterns.Add(@"\b(?:7.0%)\b");
        testPatterns.Add(@"\b(?:7.0%)\W");
        testPatterns.Add(@"\b(?:7.0%)(\W|$)");
        testPatterns.Add(@"\b(?:7.0%)(?!\w)");

        foreach (var patt in testPatterns)
        {
            Console.WriteLine(string.Format("Testing pattern '{0}'", patt));

            foreach (var input in testInputs)
            {
                Console.WriteLine(string.Format("Input '{0}'; result: {1}", input, Regex.IsMatch(input, patt)));
            }

            Console.WriteLine();
        }

输出:

Testing pattern '\b(?:7.0%)\b'
Input 'This string contains 7.0% embedded within it.'; result: False
Input 'In this string, 7.0%
is at the end of a line.'; result: False
Input '7.0% starts this string.'; result: False
Input 'This string ends with 7.0%'; result: False

Testing pattern '\b(?:7.0%)\W'
Input 'This string contains 7.0% embedded within it.'; result: True
Input 'In this string, 7.0%
is at the end of a line.'; result: True
Input '7.0% starts this string.'; result: True
Input 'This string ends with 7.0%'; result: False

Testing pattern '\b(?:7.0%)(\W|$)'
Input 'This string contains 7.0% embedded within it.'; result: True
Input 'In this string, 7.0%
is at the end of a line.'; result: True
Input '7.0% starts this string.'; result: True
Input 'This string ends with 7.0%'; result: True

Testing pattern '\b(?:7.0%)(?!\w)'
Input 'This string contains 7.0% embedded within it.'; result: True
Input 'In this string, 7.0%
is at the end of a line.'; result: True
Input '7.0% starts this string.'; result: True
Input 'This string ends with 7.0%'; result: True

1 个答案:

答案 0 :(得分:3)

你是一个正确的轨道。当有字符时,您的表达式\b(?:7.0%)(\W|$)将与7.0%后面的字符匹配。相反,请考虑使用否定前瞻(?!\w),以便额外的字符不属于您的匹配。

\b(?:7.0%)(?!\w)

如果字符串以7.0%结尾,则会匹配,如果字符串以7.0%.结尾,则匹配7.0%。它将匹配您的正则表达式选项是否表示单行或多行。