【发布时间】:2018-04-25 23:31:23
【问题描述】:
我有一个包含几段的大文本。我想搜索包含一组单词的文本,不按任何顺序,例如 {"word3", "word2", "word1"}。需要返回文本的部分,可以跨越多个句子或段落。 请问这个的正则表达式是什么?
【问题讨论】:
-
您的文本中是否有任何内容表示一节的开始或结束?像一个特殊字符,甚至是“部分”这个词?
标签: regex
我有一个包含几段的大文本。我想搜索包含一组单词的文本,不按任何顺序,例如 {"word3", "word2", "word1"}。需要返回文本的部分,可以跨越多个句子或段落。 请问这个的正则表达式是什么?
【问题讨论】:
标签: regex
您需要有一种方法来声明此“文本部分”如何开始和结束。
我假设您的部分在换行符处停止 (\n)。
类似:
(\n?).+(word1|word2|word3).+(\n|\.)
可以让它工作。这将返回整个段落(假设每个段落由 \n 与下一个分隔。
【讨论】:
lookaheads 可用于确保多个条件,一般形式将是
(?=.*word1.*$)(?=.*word2.*$)(?=.*word3.*$).*$
$ 可以通过节的结尾来更改。
可以使用单词边界来避免子单词匹配,如果. 可以匹配换行符,也可以使用s 开关。
(?=.*\bword1\b.*$)(?=.*\bword2\b.*$)(?=.*\bword3\b.*$).*$
【讨论】:
我同意 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]+ 匹配。
【讨论】:
如果你对一组词做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。
当然,对于本质上伴随white space的words,regex也需要空格,所以基本上可能是这样的,
word1 (word2 word3|word3 word2)|word2 (word3 word1|word1 word3)|word3 (word1 word2|word2 word1)
【讨论】: