Regex 正则表达式-匹配所有单词,但只匹配唯一单词一次
是否可以使用正则表达式匹配所有单词,但只匹配唯一单词一次我知道还有其他方法可以做到这一点,但是我想知道使用正则表达式是否可以做到这一点。 例如,我当前有以下表达式:Regex 正则表达式-匹配所有单词,但只匹配唯一单词一次,regex,Regex,是否可以使用正则表达式匹配所有单词,但只匹配唯一单词一次我知道还有其他方法可以做到这一点,但是我想知道使用正则表达式是否可以做到这一点。 例如,我当前有以下表达式: (\w+\b)(?!.*\1) 和以下字符串: glass shoes door window door glasses. window glasses 在大多数情况下,该表达式起作用并与以下单词匹配: shoes door window glasses 这有两个问题: 子字符串的匹配正在“glass”和“glass”上进行
(\w+\b)(?!.*\1)
和以下字符串:
glass shoes door window door glasses. window glasses
在大多数情况下,该表达式起作用并与以下单词匹配:
shoes
door
window
glasses
这有两个问题:
shoes
door
window
glasses
glass
非常接近,只需在负前瞻中读取
\b
/(\w+\b)(?!.*\1\b)/
在上查看它时,完全相同,但在back引用之前有一个额外的\b,否则如果您有
玻璃鞋门窗玻璃。窗玻璃太阳镜
你会错过一个匹配的眼镜,因为它发现它在字太阳镜
/(\w+\b)(?!.\b\1\b)/
要在多行文本中搜索不同的单词,请使用[\s\s]
而不是
(\b\w+\b)(?![\s\S]*\b\1\b)
我想知道为什么
\1
显然与第一组的\b
不匹配。不应该\1
匹配组内的所有内容,而不仅仅是\w+
?@maček哇!非常感谢你,我已经花了两天的时间试图弄明白这一点@PeterStahl您必须添加\b
的原因是为了确保负前瞻匹配整个单词,而不仅仅是子字符串,默认情况下它匹配子字符串。请注意:\b
是根据\w
中定义的单词字符的单词边界,因此,在apple\u apple
@pemisthal中,\ucode>周围将没有单词边界:\1
匹配在第1个表达式中找到的任何字符,但不匹配断言。您还应该在\w
之前添加一个\b
,以避免因太阳镜
而失败。正确答案是。其他答案并不能解释整句话。