在彼此相邻的‘n’个单词中查找相同单词的正则表达式

在彼此相邻的‘n’个单词中查找相同单词的正则表达式

我正在尝试编写一个正则表达式搜索,用于查找相距 n 个单词(例如,大于 1 个,小于 5 个)以内的任意两个(或更多)单词。目标是搜索散文文本,并查找彼此接近的不需要重复的单词。

示例:在以下文本中,搜索应识别“package:”

邮递员送来了一个包裹,包裹很重。

挑战在于这两个词可以任何两个词,但必须是相同的两个词。我一直在尝试找出一种使用*或的方法+(我对正则表达式还不熟悉),但当然,通配符会匹配每个单词,所以它们不起作用。有没有这样的搜索结构$1 within n of $1可以转换成正则表达式?

答案1

我认为正则表达式不是您这里所需要的——除非您之前知道这些单词,否则您无法表达这一点。

因此,我猜您可以继续解析文本中的每个单词(例如排序,然后删除重复项)。然后,对找到的每个单词运行以下正则表达式(此处的单词是foo):

\bfoo\W+(?:\w+\W+){1,5}?foo\b

这里,\b是单词边界。然后匹配实际单词。之后,\W是任意非单词字符,多次。现在开始一个组(被 包围()),可以出现 1 到 5 次({1,5})。该组不会被捕获?:)。

此处有一个实际示例

答案2

https://en.wikipedia.org/wiki/Regular_expression

几乎所有现代正则表达式库中的许多功能都提供了超越正则语言的表达能力。例如,许多实现允许用括号对子表达式进行分组,并在同一表达式中调用它们匹配的值(反向引用)。这意味着,除其他外,模式可以匹配重复单词的字符串,如“papa”或“WikiWiki”,在形式语言理论中称为方块。这些字符串的模式是 (.+)\1。

因此,slhck 的答案中给出的模式可以修改得更加灵活:
\b(\w+)\W+(?:\w+\W+){1,5}?\1\b
导致
完全匹配:package, and the package
组 1:package
对于问题中给出的测试字符串。
使用https://regex101.com/聚合酶链反应设置为一种口味。

相关内容