Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby正则表达式从字符串中提取重复字符序列?_Ruby_Regex_Loops_Nested_Repeat - Fatal编程技术网

如何使用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

我有这样一个字符串“++++001-----zx……”我想用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=“+++++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)在我的答案中添加了一条注释,解释每组中的两个匹配项。