1

我有这样一个字符串“++++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)但它只捕获重复序列的第一个字符。有可能吗?

4

3 回答 3

3

这有点棘手。

您确实想要捕获超过任何给定角色之一的任何组。所以一个很好的方法是使用反向引用。您的解决方案接近正确。

/((.)\2+)/应该做的伎俩。

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

于 2013-07-24T19:13:00.893 回答
1
str =  "++++001------zx.......?????????xxxxxxx" 
str.chars.chunk{|e| e}.map{|e| e[1].join if e[1].size >1 }.compact
# => ["++++", "00", "------", ".......", "?????????", "xxxxxxx"]
于 2013-07-24T18:56:07.563 回答
0

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

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

在线查看Ruby 演示Rubular 演示(注意匹配结果字段中如何突出显示匹配项)。

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

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

于 2021-02-14T20:01:43.983 回答