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を取得したいのですが、2 行目ではaaabbbbccc ccccc が必要です。これで、正規表現の一部と、それをテストするための Ruby コードの一部を作成しました。

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

今私の問題は、(?:\|(\s*[^\|]+\s*))+パーツが複数のグループを作成できないことです。各行に必要なテキストの数が可変であるため、この問題を解決する方法がわかりません。誰でも助けることができますか?

4

4 に答える 4

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 に答える
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 に答える