参考我的问题正则表达式匹配整个单词与特殊字符不起作用?,
我得到了答案
@"(?<=^|\s)" + pattern + @"(?=\s|$)"
Run Code Online (Sandbox Code Playgroud)
这适用于除1例外的所有情况.当模式中有空间时,它会失败.
假设字符串是"嗨这是stackoverflow",模式是"this",然后它说没有匹配.这是因为模式中的实际字符串后面有空格.
我们怎么办呢?理想情况下应该说找到一场比赛!
试试这个
(?:(?<=^|\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)
| 归档时间: |
|
| 查看次数: |
5169 次 |
| 最近记录: |