我已经阅读了这个正则表达式的流行(28k浏览量) question。但它对我不起作用。已经找到了更好的正则表达式,但我几乎无法处理任何小问题。
这是饮品清单:
whisky/gin/nuka-cola/beer/liqueur/abs-inth/tea
和脚本应该得到所有的非软饮料。我为这个找到了很好的正则表达式:
/\b(?!(?:tea|nuka\-cola)\b)[\w\d\-]+\b/
结果是:
1 : whisky
2 : gin
3 : -cola
4 : beer
5 : liqueur
6 : abs-inth
问题出在可乐(第三个结果)。这是因为\b不喜欢'-‘字符。请帮我把这瓶可乐从单子上去掉。
发布于 2012-01-21 16:11:33
\b
在字母数字和非字母数字字符之间进行匹配,因此它在nuka-cola
中的破折号之前和之后进行匹配。
因此,您不能将\b
用作单词边界锚点,但您可以定义自己的边界锚点。既然您的分隔符是/
,那么只需使用(?<=/|^)
作为“单词开头”锚点,使用(?=/|$)
作为“单词结尾”锚点:
/(?<=\/|^)(?!(?:tea|nuka\-cola)(?=\/|$))[\w\d\-]+(?=\/|$)/
当然,这假设您使用的是支持lookbehind断言的regex引擎。不幸的是,您没有指定这是针对哪种语言的。例如,JavaScript不支持lookbehinds。
发布于 2012-01-22 03:17:52
这个正则表达式应该可以做到这一点:
(?>[\w-]+)(?<!tea|nuka-cola)
另一种可能是,如果您确保每个关键字都以正斜杠开头:
/(?!tea|nuka-cola)([\w-]+)
如果你打算多喝两杯,而这两杯酒不应该出现在你的结果中,那么正则表达式可能很快就会变得丑陋。在这种情况下,我会有一个正则表达式(或一个简单的循环)来匹配列表中的每个单词,并检查匹配的单词是否存在于HashSet中。如果找到匹配项,我不会在结果中包含该匹配项。
https://stackoverflow.com/questions/8954185
复制