1

我正在使用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}

我想在每条管道之间获取修剪后的文本。例如,对于上例的第一行,我想要得到结果aaabbbb,对于第二行,我想要aaabbbbccc ccccc。现在我写了一段正则表达式和一段ruby代码来测试它:

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

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

4

4 回答 4

1

你为什么不拆分你的字符串?

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"
于 2010-04-06T15:28:40.533 回答
1

与其试图一次做所有事情,不如分而治之:

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
于 2010-04-06T16:07:10.197 回答
1

这可能会帮助你

脚本

a = [
  '${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}'
]

a.each do |input|
  puts input
  input.scan(/[:|]([^|}]+)/).flatten.each do |s|
    puts s.gsub(/(^\s+|\s+$)/, '') # trim
  end
end

输出

${1:aaa|bbbb}
aaa
bbbb
${233:aaa | bbbb | ccc  ccccc }
aaa
bbbb
ccc  ccccc
${34: aaa | bbbb | cccccccc     |d}
aaa
bbbb
cccccccc
d
${343:   aaa   |   bbbb   |       cccccccc     |dddddd   ddddddddd}
aaa
bbbb
cccccccc
dddddd   ddddddddd
${3443:a aa|bbbb|cccccccc|d}
a aa
bbbb
cccccccc
d
${353:aa a| b b b b | c c c c c c c c      |        dddddd}
aa a
b b b b
c c c c c c c c
dddddd
于 2010-04-06T16:12:40.813 回答
1

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

在您的情况下,您可以执行搜索和替换来替换^\d+:任何内容。这会去掉字符串开头的数字和冒号。然后调用split()使用正则表达式\s*\|\s*将字符串拆分为由竖线分隔的元素。

于 2010-04-08T02:50:15.660 回答