如何找到与周围单词的匹配?

Mat*_*ock 2 text-processing

我想找到与周围单词的匹配项。我也希望它快。

这是我所拥有的:

grep -o -P '(\w+ ){0,n}match( \w+){0,m}'

n 是短语之前的单词数,m 是短语之后的单词数。匹配是我正在寻找的短语。

有没有更快的方法来做到这一点?

例子:

echo word1 word2 word3 123 word4 word5 word6 | grep -o -P '(\w+ ){0,2}123( \w+){0,2}'

=> word2 word3 123 word4 word5

Jig*_*aga 5

(\w+ )将匹配一个词或词的一部分。这意味着grep将每个单词中的每个字符都视为潜在的匹配开始。在您的示例中,它将考虑每个

  • word1
  • ord1
  • rd1
  • d1
  • 1

在继续成功的比赛之前(从 开始word2)。

由于您对查找整个单词感兴趣,您可以通过在模式中包含单词边界来防止所有尝试的中间词匹配:

grep -P '\<(\w+ ){0,2}123( \w+){0,2}\>'
Run Code Online (Sandbox Code Playgroud)

这样做的另一个效果是123当它出现在较长的单词中时防止匹配。

这对我来说减少了 100 倍的时间(测试用例:在 Ulysses 中搜索“我”这个词)

http://www.regular-expressions.info/examples.html的“陷阱”部分对正则表达式变慢的原因有一些很好的指导。