我有一个大文本,有几个段落。我想搜索包含一组单词的文本,而不是按任何顺序,例如{"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
意味着word1
,b
word2
,c
word3
。
当然,对于本质上伴随white space
的words
,regex
也需要留白,所以基本上可能是这样的,
word1 (word2 word3|word3 word2)|word2 (word3 word1|word1 word3)|word3 (word1 word2|word2 word1)