【问题标题】:Regex to match all words except a given list (2)正则表达式匹配除给定列表之外的所有单词 (2)
【发布时间】:2012-01-21 15:33:01
【问题描述】:

我已经阅读了这个正则表达式的流行(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 不喜欢 '-' 字符。请帮我把这个可乐从列表中删除。

【问题讨论】:

  • 我可能会通过 / 拆分来接近它,然后使用字符串搜索(如果你已经结婚,则使用正则表达式)来寻找“茶”或“可乐”并否定这些标记列表中的匹配项。
  • 作为一种快速解决方法,将-cola 添加到不允许的饮料中。
  • @tripleee,在这种情况下还有cola

标签: regex


【解决方案1】:

\b 匹配字母数字字符和非字母数字字符,因此它匹配nuka-cola 中的破折号前后。

因此,您不能使用\b 作为单词边界锚点,但您可以定义自己的。看到您的分隔符是/,只需使用(?<=/|^) 作为“单词开头”锚点,(?=/|$) 作为“单词结尾”锚点:

/(?<=\/|^)(?!(?:tea|nuka\-cola)(?=\/|$))[\w\d\-]+(?=\/|$)/

当然,这假设您使用的是支持后向断言的正则表达式引擎。不幸的是,您没有指定这是针对哪种语言。例如,JavaScript 不支持后视。

【讨论】:

  • 非常感谢您的解释!真的很有帮助!
【解决方案2】:

这个正则表达式应该可以解决问题:

(?>[\w-]+)(?<!tea|nuka-cola)

另一种可能性,如果您确保每个关键字都以正斜杠开头:

/(?!tea|nuka-cola)([\w-]+)

如果您打算在结果中添加多于两种不应该出现的饮料,那么正则表达式可能会很快变得丑陋。在这种情况下,我将有一个匹配列表中每个单词的正则表达式(或一个简单的循环),并检查匹配的单词是否存在于 HashSet 中。如果找到匹配项,我不会将匹配项包含在结果中。

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多