我有一个包含几段的大文字。我想搜索包含一组单词的文本,而不是任何顺序,例如{“word3”,“word2”,“word1”}。需要返回文本的部分,可以跨越多个句子或段落。 请问这是什么正则表达式?
答案 0 :(得分:0)
你需要有办法宣告这个"部分的文字"开始和结束。
我会假设你的部分停在一个换行符(\n
)。
类似的东西:
(\n?).+(word1|word2|word3).+(\n|\.)
可以使它工作。这将返回整个段落(假设每个段落由\n
与下一段隔开。
答案 1 :(得分:0)
lookaheads可以用来确保多种条件,一般形式将是
(?=.*word1.*$)(?=.*word2.*$)(?=.*word3.*$).*$
其中$
可以通过截面的末尾来改变。
可以使用字边界来避免子字匹配,如果s
可能与换行符匹配,也可以使用.
切换。
(?=.*\bword1\b.*$)(?=.*\bword2\b.*$)(?=.*\bword3\b.*$).*$
答案 2 :(得分:0)
我同意mpliax,你必须有办法划分这些部分,这是一种定义段落或句子的方法。
假设您的段落由换行符分隔,并且我们正在寻找“grep”,“contains”和“text”,您可以使用match that paragraph的一系列前瞻:
([^\n]+(?=grep))([^\n]+(?=text))([^\n]+(?=contains))[^\n]+
或者这个稍微不同的模式,假设一个句子必须以句号,问号或感叹号结尾(一个错误的假设?),并尝试match just the sentence:
([^\.?!]+(?=grep))([^\.?!]+(?=text))([^\.?!]+(?=contains))[^\.?!]+
这两种模式都遵循这种结构:([NON-delimiter]+(?=keyword))
前瞻,尽可能多地一个接一个,以便我们知道在下一个分隔符发生之前我们可以“看到”我们的关键字。然后我们将整个段落与最后一个令牌[NON-delimiter]+
匹配。
答案 3 :(得分:0)
如果您对这组字词进行了ignore the order
,我认为对于3个字的集合,有几个combinations
,例如abc, acb, bca, bac, cab, cba
。
因此,似乎需要匹配3个单词组的可能组合
a(bc|cb)|b(ca|ac)|c(ab|ba)
Demo ,,,其中假设a
表示word1
,b
表示word2
,c
表示word3
}。
当然,对于基本上伴随words
的{{1}},white space
也需要空格,所以基本上可能是这样,
regex