我们有一个客户端应用程序,用户希望在其中搜索指定文本的“注释”字段。字段使用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
答案 0 :(得分:3)
你是一个正确的轨道。当有字符时,您的表达式\b(?:7.0%)(\W|$)
将与7.0%
后面的字符匹配。相反,请考虑使用否定前瞻(?!\w)
,以便额外的字符不属于您的匹配。
\b(?:7.0%)(?!\w)
如果字符串以7.0%
结尾,则会匹配,如果字符串以7.0%.
结尾,则匹配7.0%
。它将匹配您的正则表达式选项是否表示单行或多行。