正则表达式,用于包含一组单词的文本部分



我有一个大文本,有几个段落。我想搜索包含一组单词的文本,而不是按任何顺序,例如{"word3","word2","word1"}。需要返回文本的部分,可以跨越多个句子或段落。 请问这个的正则表达式是什么?

你需要有一种方法来声明这个"文本部分"是如何开始和结束的。

我将假设您的部分停止在新行字符 (n)。

像这样:

(n?).+(word1|word2|word3).+(n|.)

可以让它工作。这将返回整个段落(假设每个段落与下一个段落用n分隔。

可以使用前瞻来保证多种条件,一般形式将是

(?=.*word1.*$)(?=.*word2.*$)(?=.*word3.*$).*$

$可以通过部分结尾进行更改。

单词边界可用于避免子单词匹配,如果.可能匹配换行符,也可以使用s开关。

(?=.*bword1b.*$)(?=.*bword2b.*$)(?=.*bword3b.*$).*$

我同意 mpliax 的观点,你必须有一种方法来分隔这些部分,一种定义段落或句子的方法。

假设您的段落由换行符分隔,并且我们正在寻找"grep"、"contains"和"text",您可以使用一系列前瞻来匹配该段落:

([^n]+(?=grep))([^n]+(?=text))([^n]+(?=contains))[^n]+

或者这种略有不同的模式,它假设一个句子必须以句点、问号或感叹号结尾(一个糟糕的假设?),并试图只匹配句子:

([^.?!]+(?=grep))([^.?!]+(?=text))([^.?!]+(?=contains))[^.?!]+

两种模式都遵循以下结构:([NON-delimiter]+(?=keyword))前瞻,一个接一个地查看我们想要的尽可能多的内容,以便我们知道我们可以在下一个分隔符发生之前"看到"我们的关键字。然后我们只需将整个段落与最后一个令牌[NON-delimiter]+匹配。

如果你ignore the order一组单词,我认为这组 3 个单词有几个combinations,例如abc, acb, bca, bac, cab, cba.

因此,这似乎是匹配 3 个单词集的可能组合所必需的

a(bc|cb)|b(ca|ac)|c(ab|ba)

演示,,,其中假设a意味着word1bword2cword3

当然,对于本质上伴随white spacewordsregex也需要留白,所以基本上可能是这样的,

word1 (word2 word3|word3 word2)|word2 (word3 word1|word1 word3)|word3 (word1 word2|word2 word1)

最新更新