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

Gur*_*ruC 0 .net regex match

参考我的问题正则表达式匹配整个单词与特殊字符不起作用?,

我得到了答案

@"(?<=^|\s)" + pattern + @"(?=\s|$)"
Run Code Online (Sandbox Code Playgroud)

这适用于除1例外的所有情况.当模式中有空间时,它会失败.

假设字符串是"嗨这是stackoverflow",模式是"this",然后它说没有匹配.这是因为模式中的实际字符串后面有空格.

我们怎么办呢?理想情况下应该说找到一场比赛!

ste*_*ema 8

试试这个

(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))this (?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))
Run Code Online (Sandbox Code Playgroud)

在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();
Run Code Online (Sandbox Code Playgroud)

更新:

这个"空白"边界可以更通用,因此在模式的每一边都是相同的表达式,就像这样

(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))
Run Code Online (Sandbox Code Playgroud)

在c#中:

MatchCollection result = Regex.Matches(str, @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))" + pattern + @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)