Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Regex Group - Fatal编程技术网

Ruby 一个重复的正则表达式能否创建多个组?

Ruby 一个重复的正则表达式能否创建多个组?,ruby,regex,regex-group,Ruby,Regex,Regex Group,我正在使用RUBY的正则表达式来处理诸如 ${1:aaa|bbbb} ${233:aaa | bbbb | ccc ccccc } ${34: aaa | bbbb | cccccccc |d} ${343: aaa | bbbb | cccccccc |dddddd ddddddddd} ${3443:a aa|bbbb|cccccccc|d} ${353:aa a| b b b b | c c c c c c c c |

我正在使用RUBY的正则表达式来处理诸如

${1:aaa|bbbb}
${233:aaa | bbbb | ccc  ccccc }
${34: aaa | bbbb | cccccccc     |d}
${343:   aaa   |   bbbb   |       cccccccc     |dddddd   ddddddddd}
${3443:a aa|bbbb|cccccccc|d}
${353:aa a| b b b b | c c c c c c c c      |        dddddd}
我想获得每条管线之间的修剪文本。例如,对于上例的第一行,我想要得到结果aaa和bbbb,对于第二行,我想要aaabbbbccc。现在我已经编写了一段正则表达式和一段ruby代码来测试它:

array = "${33:aaa|bbbb|cccccccc}".scan(/\$\{\s*(\d+)\s*:(\s*[^\|]+\s*)(?:\|(\s*[^\|]+\s*))+\}/)
puts array

现在我的问题是
(?:\\\;(\s*[^\\\\]+\s*)+
部分无法创建多个组。我不知道如何解决这个问题,因为每行中我需要的文本数量是可变的。有人能帮忙吗?

你为什么不分开你的绳子

str = "${233:aaa | bbbb | ccc  ccccc }"
str.split(/\d+|\$|\{|\}|:|\|/).select{|v| !v.empty? }.select{|v| !v.empty? }.map{|v| v.strip}.join(', ')
#=> "aaa, bbb, cc cccc"

你为什么不把绳子分开

str = "${233:aaa | bbbb | ccc  ccccc }"
str.split(/\d+|\$|\{|\}|:|\|/).select{|v| !v.empty? }.select{|v| !v.empty? }.map{|v| v.strip}.join(', ')
#=> "aaa, bbb, cc cccc"

不要试图同时做每件事,而是分而治之:

DATA.each do |line|
    line =~ /:(.+)\}/
    items = $1.strip.split( /\s* \| \s*/x )
    p items
end

__END__
${1:aaa|bbbb}
${233:aaa | bbbb | ccc  ccccc }
${34: aaa | bbbb | cccccccc     |d}
${343:   aaa   |   bbbb   |       cccccccc     |dddddd   ddddddddd}
${3443:a aa|bbbb|cccccccc|d}
${353:aa a| b b b b | c c c c c c c c      |        dddddd}
如果要使用单个正则表达式,可以使用
scan
,但这似乎更难:

DATA.each do |line|
    items = line.scan( /[:|] ([^|}]+) /x ).flatten.map { |i| i.strip }
    p items
end

不要试图同时做每件事,而是分而治之:

DATA.each do |line|
    line =~ /:(.+)\}/
    items = $1.strip.split( /\s* \| \s*/x )
    p items
end

__END__
${1:aaa|bbbb}
${233:aaa | bbbb | ccc  ccccc }
${34: aaa | bbbb | cccccccc     |d}
${343:   aaa   |   bbbb   |       cccccccc     |dddddd   ddddddddd}
${3443:a aa|bbbb|cccccccc|d}
${353:aa a| b b b b | c c c c c c c c      |        dddddd}
如果要使用单个正则表达式,可以使用
scan
,但这似乎更难:

DATA.each do |line|
    items = line.scan( /[:|] ([^|}]+) /x ).flatten.map { |i| i.strip }
    p items
end
这可能对你有帮助

剧本 输出 这可能对你有帮助

剧本 输出
在正则表达式中重复捕获组时,捕获组仅存储与上次迭代匹配的文本。如果需要捕获多个迭代,则需要使用多个正则表达式。(.NET是唯一的例外。它的
CaptureCollection
提供捕获组所有迭代的匹配。)


在您的情况下,您可以执行搜索和替换以将
^\d+:
替换为零。这会去掉字符串开头的数字和冒号。然后使用正则表达式调用
split()
,将字符串拆分为由垂直条分隔的元素。

在正则表达式中重复捕获组时,捕获组仅存储与上次迭代匹配的文本。如果需要捕获多个迭代,则需要使用多个正则表达式。(.NET是唯一的例外。它的
CaptureCollection
提供捕获组所有迭代的匹配。)


在您的情况下,您可以执行搜索和替换以将
^\d+:
替换为零。这会去掉字符串开头的数字和冒号。然后调用
split()。可以告诉我在哪里可以找到更多关于
数据
结束
和其他类似Ruby魔法的信息吗?@smotchkiss
数据
结束
反映了Ruby的Perl传统。这里有一个链接:。@FM,这是一个有趣的脚本。可以告诉我在哪里可以找到更多关于
数据
结束
和其他类似Ruby魔法的信息吗?@smotchkiss
数据
结束
反映了Ruby的Perl传统。这里有一个链接:。