【问题标题】:Regular expression - match all words but match unique words only once正则表达式 - 匹配所有单词但仅匹配唯一单词一次
【发布时间】:2012-12-27 21:10:39
【问题描述】:

是否可以使用正则表达式匹配所有单词但只匹配唯一单词一次? 我知道还有其他方法可以做到这一点,但我想知道这是否可以通过使用正则表达式来实现。

例如我目前有以下表达式:

(\w+\b)(?!.*\1)

以及以下字符串:

glass shoes door window door glasses. window glasses

在大多数情况下,该表达式有效并匹配以下单词:

shoes
door 
window
glasses

这有两个问题:

  1. 正在用“glass”在“glasses”上匹配子字符串, 这是不正确的。

  2. “眼镜”和“眼镜”。应该匹配,但目前不匹配。

最后的比赛应该是:

shoes 
door 
window 
glasses 
glass 

【问题讨论】:

  • 正确答案是here。其他答案不能解释整个单词。

标签: regex


【解决方案1】:

非常接近,刚刚在否定前瞻中读取了\b

/(\w+\b)(?!.*\1\b)/

查看Rubular

【讨论】:

  • 我想知道为什么\1 显然与第一组中的\b 不匹配。 \1 不应该匹配组内的所有内容,而不仅仅是 \w+
  • @maček 哇!非常感谢,我已经花了两天时间试图弄清楚这一点!
  • @PeterStahl 必须添加\b 的原因是为了确保否定前瞻匹配整个单词而不仅仅是子字符串,默认情况下它匹配子字符串。
  • 请注意:\b是根据\w中定义的单词字符的单词边界,所以apple_apple中的_周围不会有单词边界。
  • @pemistahl: \1 匹配在第一个表达式中找到的任何 characters,但不匹配断言。
【解决方案2】:

要在多行文本中搜索不同的单词,请使用 [\s\S] 而不是 .

(\b\w+\b)(?![\s\S]*\b\1\b)

【讨论】:

    【解决方案3】:

    maček's answer 完全相同,但在反向引用之前有一个额外的\b,否则如果你有

    glass shoes door window door glasses. window glasses sunglasses

    你会错过眼镜的匹配,因为它在太阳镜这个词中找到。

    /(\w+\b)(?!.*\b\1\b)/

    【讨论】:

    • 您还应该在\w 之前添加一个\b,以免sunglasses glasses 失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多