【问题标题】:Regex for sections of the text that contain a set of words包含一组单词的文本部分的正则表达式
【发布时间】:2018-04-25 23:31:23
【问题描述】:

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

【问题讨论】:

  • 您的文本中是否有任何内容表示一节的开始或结束?像一个特殊字符,甚至是“部分”这个词?

标签: regex


【解决方案1】:

您需要有一种方法来声明此“文本部分”如何开始和结束。

我假设您的部分在换行符处停止 (\n)。

类似:

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

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

【讨论】:

    【解决方案2】:

    lookaheads 可用于确保多个条件,一般形式将是

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

    $ 可以通过节的结尾来更改。

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

    (?=.*\bword1\b.*$)(?=.*\bword2\b.*$)(?=.*\bword3\b.*$).*$
    

    【讨论】:

      【解决方案3】:

      我同意 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]+ 匹配。

      【讨论】:

        【解决方案4】:

        如果你对一组词做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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-07
          • 1970-01-01
          • 1970-01-01
          • 2016-01-14
          相关资源
          最近更新 更多