如何使用Ruby正则表达式从字符串中提取重复的字符序列?

时间:2013-07-24 18:50:54

标签: ruby regex loops nested repeat

我有这样一个字符串“++++ 001 ------ zx ....... ????????? xxxxxxx”我想提取多个连续长度序列化为带有Ruby正则表达式的扁平数组:

["++++",
"00",
"------",
".......",
"?????????",
"xxxxxxx"]

我可以用嵌套循环来实现这个目的:

s="++++001------zx.......?????????xxxxxxx"
t=s.split(//)
i=0
f=[]
while i<=t.length-1 do
  j=i
  part=""
  while t[i]==t[j] do
    part=part+t[j]
    j=j+1
  end
  i=j
  if part.length>=2 then f.push(part) end
end

但我无法找到合适的正则表达式来提供扫描方法。我试过这个:s.scan(/(.)\1++/x)但它只捕获重复序列的第一个字符。 它有可能吗?

3 个答案:

答案 0 :(得分:2)

这有点棘手。

您确实希望捕获任何给定角色中的一个以上的任何组。所以这样做的好方法是使用反向引用。你的解决方案接近正确。

/((.)\2+)/应该可以解决问题。

请注意,如果您使用扫描,则会为每个匹配组返回两个值。第一个是序列,第二个是值。

答案 1 :(得分:1)

str =  "++++001------zx.......?????????xxxxxxx" 
str.chars.chunk{|e| e}.map{|e| e[1].join if e[1].size >1 }.compact
# => ["++++", "00", "------", ".......", "?????????", "xxxxxxx"]

答案 2 :(得分:0)

如果您只需要在忽略(省略)所有捕获组值时获取整体匹配值,类似于 String#match 在 JavaScript 中的工作方式,您可以使用带有单个正则表达式参数的 String#gsub (没有替换参数)返回一个 Enumerator,用 .to_a 获取匹配数组:

text = "++++001------zx.......?????????xxxxxxx" 
p text.gsub(/(.)\1+/m).to_a
# => ["++++", "00", "------", ".......", "?????????", "xxxxxxx"]

查看 Ruby demo onlineRubular demo(注意如何在 Match result 字段中突出显示匹配项)。

我添加了 m 修饰符只是为了完整性,为了 . 也匹配默认情况下 . 不匹配的换行符。

另外,请参阅相关的 Capturing groups don't work as expected with Ruby scan method 线程。