如何使用Ruby正则表达式从字符串中提取重复字符序列?
我有这样一个字符串“++++001-----zx……”我想用Ruby正则表达式将一个以上长度的连续序列提取到平坦数组中:如何使用Ruby正则表达式从字符串中提取重复字符序列?,ruby,regex,loops,nested,repeat,Ruby,Regex,Loops,Nested,Repeat,我有这样一个字符串“++++001-----zx……”我想用Ruby正则表达式将一个以上长度的连续序列提取到平坦数组中: ["++++", "00", "------", ".......", "?????????", "xxxxxxx"] 我可以通过嵌套循环实现这一点: s="++++001------zx.......?????????xxxxxxx" t=s.split(//) i=0 f=[] while i<=t.length-1 do j=i part="" wh
["++++",
"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=“+++++001------zx……?????????xxxxxxx”
t=s.分割(/)
i=0
f=[]
当i=2时,则f.推动(部件)结束
结束
但是我无法找到一个合适的正则表达式来输入scan方法。我试过:s.scan(/()\1++/x)
但它只捕获重复序列的第一个字符。
有可能吗?这有点棘手
str = "++++001------zx.......?????????xxxxxxx"
str.chars.chunk{|e| e}.map{|e| e[1].join if e[1].size >1 }.compact
# => ["++++", "00", "------", ".......", "?????????", "xxxxxxx"]
您确实希望捕获任何一个以上给定角色的组。所以一个很好的方法就是使用反向引用。您的解决方案接近正确
/(()\2+)/
应该可以做到这一点
请注意,如果使用扫描,将为每个匹配组返回两个值。第一个是序列,第二个是值。这有点棘手
您确实希望捕获任何一个以上给定角色的组。所以一个很好的方法就是使用反向引用。您的解决方案接近正确
/(()\2+)/
应该可以做到这一点
请注意,如果使用扫描,将为每个匹配组返回两个值。第一个是序列,第二个是值。如果您只需要获取整体匹配值,而忽略(忽略)所有捕获的组值,类似于JavaScript中的
String#match
工作方式,您可以使用带有单个regex参数(无替换参数)的,使用。要获取匹配数组,请执行以下操作:
text=“+++++001------zx……?????????xxxxxxx”
p text.gsub(/()\1+/m).to_a
#=>[“++++”、“00”、“-------”、“…”、“???????”、“xxxxxxx”]
请参阅和(注意如何在“匹配结果”字段中突出显示匹配)
我添加了m
修饰符只是为了完整性,以便
也匹配
默认情况下不匹配的换行符
另外,请参阅相关线程。如果您只需要获取整体匹配值,而忽略(忽略)所有捕获的组值,类似于JavaScript中的String#match
工作方式,您可以使用带有单个正则表达式参数(无替换参数)的,使用。要获取匹配数组,请执行以下操作:
text=“+++++001------zx……?????????xxxxxxx”
p text.gsub(/()\1+/m).to_a
#=>[“++++”、“00”、“-------”、“…”、“???????”、“xxxxxxx”]
请参阅和(注意如何在“匹配结果”字段中突出显示匹配)
我添加了m
修饰符只是为了完整性,以便
也匹配
默认情况下不匹配的换行符
另外,请参阅相关的线程。请先告诉我,我就把这个留在这里:。您可能希望s.scan(…).map(&:first)
以获得所需的结果。+1 for.map(&:first)在我的答案中添加了一条注释,解释每组中的两个匹配项。请告诉我,我就把这个留在这里:。您可能希望s.scan(…).map(&:first)
以获得所需的结果。+1 for.map(&:first)在我的答案中添加了一条注释,解释每组中的两个匹配项。