【问题标题】:Capturing phrases excluding variable phrase捕获不包括可变短语的短语
【发布时间】:2016-05-26 16:51:14
【问题描述】:

我有一个正则表达式来捕获短语,它们是互斥的两个单词组(字符串中的每个单词最多会被捕获一次)。我正在尝试从捕获的组中排除特定(可变)短语。 @Casimir 提供的正则表达式/\w+\s+\w+/ 将对字符串进行分区,根据需要匹配组,但我们还需要排除可能出现在字符串中任何位置并且可能多次出现的组。

对于字符串

'next saturday, swing dancing at the kato ballroom! bring friends!'

和短语'swing dancing' 正则表达式应该返回下面返回的每个组,除了'wing dance'。

测试用例:

"next saturday, swing dancing at the kato ballroom! bring friends!".
  scan(/((?!swing dancing)(?:\w+)\s(?!swing dancing)(?:\w+))/)
=> [["next saturday"], ["wing dancing"], ["at the"], ["kato ballroom"], ["bring friends"]]

链接http://rubular.com/r/Eogo29Ociz

"next saturday, swing dancing at the kato ballroom! come dancing with friends!"
  .scan(/((?!dancing)(?:\w+)\s(?!dancing)(?:\w+))/)
=> [["next saturday"], ["ancing at"], ["the kato"], ["ancing with"]]

链接http://rubular.com/r/1TpcveiuX0

应该返回

[["next saturday"], ["at the"], ["kato ballroom"], ["with friends"]] 

正则表达式可能不需要重复否定前瞻,只要我们匹配短语两侧的短语即可排除。

我希望正则表达式对于负前瞻和匹配结果都完全不区分大小写。我尝试了/i 选项,但我也可以像上面的代码一样预先将字符串小写。

为什么正则表达式不起作用,您有改进建议吗?

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    使用捕获组来隔离目标并将之前不需要的字符串放入可选的非捕获组中:/\b(?:swing\s+dancing\W+)?(\w+\s+\w+)/

    > "next saturday, swing dancing at the kato ballroom! bring friends!".scan(/\b(?:swing\s+dancing\W+)?(\w+\s+\w+)/)
    => [["next saturday"], ["at the"], ["kato ballroom"], ["bring friends"]] 
    

    demo rubular

    或使用\K 功能:/\b(?:swing\s+dancing\W+)?\K\w+\s+\w+/

    > "next saturday, swing dancing at the kato ballroom! bring friends!".scan(/\b(?:swing\s+dancing\W+)?\K\w+\s+\w+/)
    => ["next saturday", "at the", "kato ballroom", "bring friends"] 
    

    这两种方式是相似的。他们不试图避免“摇摆舞”,相反,他们试图先找到它。然后最后一项任务是将其从结果中排除。

    第一个模式使用捕获组(因为扫描方法只返回捕获组(如果有的话)),第二个模式使用\K 表示“在此之前不返回任何内容” .

    【讨论】:

    • 不错!排除“跳舞”时,我们需要做些什么来完成这项工作?
    • @bjorn:要做到这一点,你需要阅读我的回答并理解它。
    • 问题是\b(?:dancing\W+)?(\w+\s+\w+)\b 仍然匹配“摇摆舞”这个短语。
    • @bjorn:不要从模式中删除“swing\s+”,而是将其放在一个组中(非捕获)并使其成为可选。
    • 'swing' 与第二个测试用例无关。如前所述,要排除的短语是可变的:我们也可以排除任何短语“星期六”、“朋友”或“加藤舞厅”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多