4

私の文字列区切り文字は;です。区切り文字は、文字列内で。としてエスケープされ\;ます。例えば、

irb(main):018:0> s = "a;b;;d\\;e"
=> "a;b;;d\\;e"
irb(main):019:0> s.split(';')
=> ["a", "b", "", "d\\", "e"]

誰かが私に正規表現を提案して、splitの出力が次のようになるようにすることはできます["a", "b", "", "d\\;e"]か?Ruby1.8.7を使用しています

4

2 に答える 2

6

1.8.7には、鬼車(コンパイルされる可能性があります)なしではネガティブな後読みはありません。

1.9.3; わーい:

> s = "a;b;c\\;d"
=> "a;b;c\\;d"
> s.split /(?<!\\);/
=> ["a", "b", "c\\;d"]

1.8.7 with Onigurumaは簡単な分割を提供しませんが、マッチオフセットを取得し、その方法でサブストリングを引き離すことができます。私は覚えていないこれを行うためのより良い方法があると思います:

> require 'oniguruma'
> re = Oniguruma::ORegexp.new "(?<!\\\\);"
> s = "hello;there\\;nope;yestho"
> re.match_all s
=> [#<MatchData ";">, #<MatchData ";">]
> mds = re.match_all s
=> [#<MatchData ";">, #<MatchData ";">]
> mds.collect {|md| md.offset}
=> [[5, 6], [17, 18]]

その他のオプションは次のとおりです。

  • 結果を分割し;て後処理し、末尾を探す\\、または
  • 文字ごとのループを実行し、いくつかの単純な状態を維持して、手動で分割します。
于 2012-06-22T21:56:21.193 に答える
2

@ dave-newtonが答えたように、ネガティブルックビハインドを使用できますが、1.8ではサポートされていません。1.8と1.9の両方で機能する別の方法は、splitの代わりにString#scanを使用し、パターンがnot(semicolonまたはbackslash)または接頭辞としてbacklashが付いたanycharを受け入れることです。

$ irb
>> RUBY_VERSION
=> "1.8.7"
>> s = "a;b;c\\;d"
=> "a;b;c\\;d"
s.scan /(?:[^;\\]|\\.)+/
=> ["a", "b", "c\\;d"]
于 2012-06-22T22:13:04.020 に答える