正则表达式匹配整个单词?

时间:2011-11-25 09:57:56

标签: .net regex match

参考我的问题Regex expression to match whole word with special characters not working ?

我得到了一个答案说

@"(?<=^|\s)" + pattern + @"(?=\s|$)"

除1例外,所有情况均适用。当模式中有空间时,它会失败。

假设字符串是“嗨这是堆栈溢出”并且模式是“this”,那么它表示没有匹配。发生这种情况是因为模式中的实际字符串后面有空格。

我们该如何处理?理想情况下,它应该说找到一个匹配!

1 个答案:

答案 0 :(得分:8)

试试这个

(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))this (?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))

here on Regexr

这也适用于以空格开头的模式。

基本上,我所做的是定义一个自定义的“单词”边界。但在\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);