参考我的问题Regex expression to match whole word with special characters not working ?,
我得到了一个答案说
@"(?<=^|\s)" + pattern + @"(?=\s|$)"
除1例外,所有情况均适用。当模式中有空间时,它会失败。
假设字符串是“嗨这是堆栈溢出”并且模式是“this”,那么它表示没有匹配。发生这种情况是因为模式中的实际字符串后面有空格。
我们该如何处理?理想情况下,它应该说找到一个匹配!
答案 0 :(得分:8)
试试这个
(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))this (?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))
这也适用于以空格开头的模式。
基本上,我所做的是定义一个自定义的“单词”边界。但在\W=>\w
或\w=>\W
更改时不是这样,在\S=>\s
或\s=>\S
更改时确实如此!
以下是c#中的示例:
string str = "Hi this is stackoverflow";
string pattern = Regex.Escape("this");
MatchCollection result = Regex.Matches(str, @"(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))" + pattern + @"(?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))", RegexOptions.IgnoreCase);
Console.WriteLine("Amount of matches: " + result.Count);
foreach (Match m in result)
{
Console.WriteLine("Matched: " + result[0]);
}
Console.ReadLine();
<强>更新强>
这个“空白”边界可以做得更一般,所以在模式的每一边都是相同的表达式,就像这样
(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))
在c#中:
MatchCollection result = Regex.Matches(str, @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))" + pattern + @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))", RegexOptions.IgnoreCase);