【问题标题】:Regular Expression: Find words within 10 words of each other正则表达式:查找彼此相距 10 个单词以内的单词
【发布时间】:2020-12-23 19:13:53
【问题描述】:

我有一个要求,我要查找“house”和“car”这两个词,但它们之间的距离必须在 10 个词以内。我有以下正则表达式:

(\b(?=.*[a-zA-Z])(?i)car\b)|(\b(?=.*[a-zA-Z])(?i)house\b)

这适用于任何单词组合。但是,这并不能满足“彼此相距 10 个字以内”的要求:

因此,以下将是一个很好的匹配:

car word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 house
house word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 car

但以下内容不应匹配:

house word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word 11 car

汽车字1字2字3字4字5字6字7字8字9字10字11房子

我怎样才能做到这一点?提前致谢。

【问题讨论】:

标签: regex


【解决方案1】:

如果两个词都必须存在,但相同的词之间没有匹配,您可以使用捕获组来捕获房屋或汽车。

将任何不以其中任何一个开头的单词重复 1-10 次,然后匹配其中任何一个单词,使用否定前瞻来匹配与第 1 组不同的单词。

\b(house|car)(?: (?!(?:house|car)\b)\w+){1,10} (?!\1)(house|car)\b

说明

  • \b(house|car) 一个词的边界,捕获 group 1 中的房子或汽车
  • (?:非捕获组
    • (?!(?:house|car)\b)\w+ 负前瞻,断言直接在右边的不是房子或汽车。如果是这样,匹配 1+ 个单词字符
  • ){1,10}关闭群,重复1-10次
  • (?!\1) 否定前瞻,断言直接在右边的不是第 1 组中捕获的同一个词
  • (house|car)\b 捕获第 2 组,匹配房子或汽车,后跟单词边界

如果单词也可以是直接跟随的词,您可以将量词更改为{0,10},或者更改值以适应要求。

Regex demo

如果相同的单词之间可以匹配:

\b(house|car)(?: (?!(?:house|car)\b)\w+){1,10} (house|car)\b

regex demo

【讨论】:

  • 仅供参考:空格和字母之间的单词边界是隐含的。
  • @WiktorStribiżew 是的,当然,让我更新一下。
【解决方案2】:

你可以使用这个/\b((?:house|car)\W+(?:\w+\W+){0,5}?(?:house|car)|(?:house|car)\W+(?:\w+\W+){0,10}?(?:house|car))\b\/g

见example

【讨论】:

    【解决方案3】:

    为什么不简单地尝试一下:

    (car( [^ ]*){1,10} house)|(house( [^ ]*){1,10} car)
    

    见https://regex101.com/r/rAu6Ku/1

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多