16

Ruby を使用して、単一の正規表現を使用して、「xy y ay xy +y」で x (y、ay、+y) が前にないすべての「y」に一致させるにはどうすればよいですか?
/[^x]y/ は前の文字にも一致するため、代替が必要です...

4

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