我有这样一个字符串“++++ 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)
但它只捕获重复序列的第一个字符。
它有可能吗?
答案 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 online 和 Rubular demo(注意如何在 Match result 字段中突出显示匹配项)。
我添加了 m
修饰符只是为了完整性,为了 .
也匹配默认情况下 .
不匹配的换行符。
另外,请参阅相关的 Capturing groups don't work as expected with Ruby scan method 线程。