我需要一个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
答案 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个)。