質問

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

役に立ちましたか?

解決

ゼロ幅ネガティブ後読みアサーションが必要です。探しているものを正確に示す/(?<!x)y/を試してください。つまり、「x」が前にない「y」をすべて見つけますが、幅がゼロの部分である前の文字は含まれません。

編集して追加:明らかに、これはRuby 1.9以降でのみサポートされています。

他のヒント

負の後読みは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の前の1文字以上を避けたい場合、これははるかに困難です。次に、次のような操作を行う必要があります。

"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"]

Rubyは残念ながらネガティブな後読みをサポートしていないため、複数の文字を探す必要がある場合は問題が発生します。 1文字だけで、マッチをキャプチャすることでこれを処理できます。

/[^x](y)/

PCREでは、ネガティブな後読みを使用します:

(:<!x)y

これがRubyでサポートされているかどうかはわかりませんが、いつでも調べることができます。

それはネガティブな見方で行うことができます、(?<!x)y

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top