Ruby を使用して、単一の正規表現を使用して、「xy y ay xy +y」で x (y、ay、+y) が前にないすべての「y」に一致させるにはどうすればよいですか?
/[^x]y/ は前の文字にも一致するため、代替が必要です...
質問する
9828 次
5 に答える
35
ゼロ幅の負の後読みアサーションが必要です。/(?<!x)y/
つまり、'x' が前にないすべての 'y' を見つけますが、ゼロ幅部分である前の文字は含まれません。
編集して追加: どうやら、これは Ruby 1.9 以降でのみサポートされています。
于 2009-07-31T16:27:56.440 に答える
3
否定後読みは Ruby 1.9 までサポートされていませんが、スキャンを使用して同様のことができます。
"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]]
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]} # => ["y", "y", "y"]
もちろん、. の前に複数の文字を避けたい場合、これははるかに困難ですy
。次に、次のようにする必要があります。
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/} # => [[" ", "y"], [" ball", "y"], [" +", "y"]]
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]} # => ["y", "y" "y"]
于 2009-07-31T16:51:23.960 に答える
2
残念ながら、Ruby は否定的な後読みをサポートしていないため、複数の文字を検索する必要がある場合は問題が発生します。1 文字だけの場合は、一致をキャプチャすることでこれを処理できます。
/[^x](y)/
于 2009-07-31T16:29:32.537 に答える
-1
PCRE では、否定的な後読みを使用します。
(:<!x)y
これが Ruby でサポートされているかどうかはわかりませんが、いつでも調べることができます。
于 2009-07-31T16:27:41.713 に答える
-1
後ろ向きのネガティブな表情でできますが、(?<!x)y
于 2009-07-31T16:28:07.453 に答える