忽略Regex中用于重复模式的捕获组

时间:2015-01-03 04:40:55

标签: ruby regex

/((\w)\2)/找到重复的字母。我希望避免通过忽略匹配第二个捕获组的字母而产生的二维数组:/((?:\w)\2)/。似乎这是不可能的。有什么想法吗?

Rubular example

2 个答案:

答案 0 :(得分:1)

您不需要任何捕获组:

str = [*'a+'..'z+', *'A+'..'Z+', *'0+'..'9+', '_+'].join('|')
  #=> "a+|b+| ... |z+|A+|B+| ... |Z+|0+|1+| ... |9+|_+" 

"aaabbcddd".scan(/#{str}/)
  #=> ["aaa", "bb", "c", "ddd"]

但如果你坚持要有一个:

"aaabbcddd".scan(/(#{str})/).flatten(1)
  #=> ["aaa", "bb", "c", "ddd"]
这是作弊吗?你确实问过它是否可能。

答案 1 :(得分:0)

如果您的意思是使用String#scan,则可以对结果进行后处理以仅返回第一项Enumerable#map

'helloo'.scan(/((\w)\2)/)
# => [["ll", "l"], ["oo", "o"]]

'helloo'.scan(/((\w)\2)/).map { |m| m[0] }
# => ["ll", "oo"]