1

我需要一个 ruby​​ 正则表达式来创建由下划线分隔的 11 个组,但如果有超过 11 个下划线,则根本不匹配。我还需要将连续的下划线理解为“空”组。这是我到目前为止所拥有的,它无法解决 > 11 下划线问题:

/^(dw|lat)\_(.*)\_(Paid-Search|Text-Ad)\_(.*)\_(.*)\_(.*)\_(.*)\_(.*)\_(.*)\_(.*)\_(.*)$/

这里有几个示例测试用例。

应该匹配:

lat_march 疯狂更新_付费搜索_subscription-one_google_ncaa-tournament_{adid}_p__March172014_2

但不匹配:

lat_los angeles_Paid-Search_nami-media_adn_JgYno0gS7yYjNq8OT7n_LcgTN9nt6vrmbC9qlcp__-21150_49996_7006_April22014_4

4

2 回答 2

2

你必须有一个正则表达式吗?这是一个简单的非正则表达式解决方案。

代码

(arr = str.split('_')).size == 11 ? arr : nil

例子

str = "lat_march madness update_Paid-Search_subscription-" +
        "one_google_ncaa-tournament_{adid}_p__March172014_2"

(arr = str.split('_')).size == 11 ? arr : nil
  #=> ["lat", "march madness update", "Paid-Search", "subscription-one",
  #    "google", "ncaa-tournament", "{adid}", "p", "", "March172014", "2"]

str = "lat_los angeles_Paid-Search_nami-media_adn_JgYno0gS7yYjNq8OT7n_" +
        "LcgTN9nt6vrmbC9qlcp__-21150_49996_7006_April22014_4"
(arr = str.split('_')).size == 11 ? arr : nil
  #=> nil
于 2014-04-21T23:45:13.433 回答
1

将您的更改(.*)([^_]*). 这将创建一个除之外 的任何字符类_,并匹配它 0 次以上。这种方式_永远不会被算作一个捕获组,而只是一个分隔符。此外,_它不是保留字符,因此不需要转义。最终表达

^(dw|lat)_([^_]*)_(Paid-Search|Text-Ad)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)$

更新:

如果您不需要匹配最后 8 个捕获组,则可以进一步清理此表达式:

^(dw|lat)_([^_]*)_(Paid-Search|Text-Ad)(?:_[^_]*){8}$

这只是采用最后一个模式并重复 8 次。但是,如果您尝试捕获[^_]*,它只会记住最后一次出现作为您的第 4 个捕获组(而不是记住全部 8 个)。

于 2014-04-21T21:59:50.597 回答