用于Ruby正则表达式分组的量词

时间:2014-04-21 21:55:42

标签: ruby regex quantifiers

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

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

以下是几个示例测试用例。

应匹配:

  

lat_march madness update_Paid-Search_subscription-one_google_ncaa-tournament_ {adid} _p__March172014_2

但不匹配:

  

lat_los angeles_Paid-Search_nami-media_adn_JgYno0gS7yYjNq8OT7n_LcgTN9nt6vrmbC9qlcp __- 21150_49996_7006_April22014_4

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

<强>更新

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

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

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