【发布时间】: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 选项,但我也可以像上面的代码一样预先将字符串小写。
为什么正则表达式不起作用,您有改进建议吗?
【问题讨论】: