【问题标题】:Regex expression to match whole word ?正则表达式匹配整个单词?
【发布时间】:2012-01-06 05:27:54
【问题描述】:

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

我得到了一个答案,上面写着

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

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

假设字符串是 "Hi this is stackoverflow" 并且模式是 "this" ,那么它说没有匹配。发生这种情况是因为模式中的实际字符串后面有一个空格。

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

【问题讨论】:

  • 你不能简单地从调用层修剪模式吗?假设这是一个用户输入,您可以在将用户输入发送到服务层之前对其进行修剪。

标签: .net regex match


【解决方案1】:

试试这个

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

here on Regexr

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

基本上,我正在做的是定义一个自定义的“单词”边界。但是,\W=&gt;\w\w=&gt;\W 更改不是这样,\S=&gt;\s\s=&gt;\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);

【讨论】:

  • 几乎在所有情况下都有效,但在匹配“c++ c c#”中的“c++ c”等字符串时失败
  • @pratZ,什么失败了?对我来说它工作正常,我看不出为什么它不应该匹配像 c++ 这样的东西。
  • 如果匹配 'c++' 则匹配,但如果匹配文本 'c++ c c#' 中的 'c++ c' 则失败
  • @pratZ,这取决于您使用的模式......而且这个问题没有涵盖。在这里,我将“c++ c”视为两个词。
  • 您在这里的答案非常有帮助。它适用于“c++”,但与“c++”之类的东西不匹配。它是一个完整的词(最后有一个空格),我看不出问题没有涉及到这一点。肯定会有这样的情况。
猜你喜欢
  • 2010-11-15
  • 2011-08-07
  • 2017-07-08
  • 1970-01-01
相关资源
最近更新 更多