1

Ruby 1.9 正規表現は後読みアサーションをサポートしていますが、パターンでアンカーを渡すときに問題があるようです。先読みアサーションでアンカーが渡されると、問題なく実行されます。

"well substring! "[/(?<=^|\A|\s|\b)substring!(?=$|\Z|\s|\b)/] #=> RegexpError: invalid pattern in look-behind: /(?<=^|\A|\s|\b)substring(?=$|\Z|\s|\b)/

先読みと同じように後読みアサーションでアンカーを機能させる方法を知っている人はいますか?

後読みに必要な特別なエスケープ シーケンスまたはグループ化はありますか?

パッチが適用された場合に備えて、1.9.1-p243、p376、および 1.9.2-preview3 でこの動作をテストしました。

4

3 に答える 3

1

あなたが正しいように見えます:\b先読みでは期待どおりに動作しますが、後読みでは構文エラーとして扱われます。

この場合、それは実際には問題ではありません:とにかく(?<=^|\A|\s|\b)、必要な結果が得られた場合は、それで十分です。\bアサーションに続く文字はs単語文字でなければなりません。\bつまり、(1) 前の文字が単語文字ではないか、(2)文字がないことを意味します。その場合、、 、およびはすべて冗長です。^\A\s

ただし、文字列が で始まる場合は!別の話です。 の前の文字列の先頭に一致します^が、その後に一致ます。完全な文字列として一致させたい場合は を使用する必要がありますが、単語全体のみを一致させたい場合は を使用する必要があります。\A!\b!substring!/\A!substring!\Z/substring/\bsubstring\b/

に関しては[^\B]、それは を除く任意の文字に一致しますB。Like \b,\Bはゼロ幅アサーションであり、文字クラスは正確に 1 文字と一致する必要があります。一部の正規表現フレーバーは、無効なエスケープ シーケンスに対して例外をスローします\Bが、Ruby (または鬼車、より可能性が高い) はそれを許可します。

于 2010-08-02T22:09:39.347 に答える
0

後読みの解釈は、先読みアサーションのようなグループ () ではなく、範囲 [] の解釈であるように見えます。これは、\b が無効なバックスペース文字であり、単語の境界ではないことを意味している可能性があります。

"well substring! "[/(?<=^|\A|\s|[^\B])substring!(?=$|\Z|\s|\b)/]  #=> substring!
"well substring! "[/(?<=^|\A|\s|[^\B])substring(?=$|\Z|\s|\b)/]   #=> substring
"well !substring! "[/(?<=^|\A|\s|[^\B])substring(?=$|\Z|\s|\b)/]  #=> substring
"well !substring! "[/(?<=^|\A|\s|[^\B])!substring(?=$|\Z|\s|\b)/] #=> !substring

他のすべてが失敗した場合...二重否定を使用してください!

于 2010-08-02T20:40:17.693 に答える
0

ええ、Ruby 1.9.2 は後ろ向きで \b をサポートしていないようです。

ruby-1.9.2-p180 :034 > "See Jeffs book and it seems fine!".gsub(/(?=s\b)(?<=\bJeff)/,"'")
SyntaxError: (irb):34: invalid pattern in look-behind: /(?=s\b)(?<=\bJeff)/
from /home/pratikk/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'

ruby-1.9.2-p180 :033 > "See Jeffs book and it seems fine!".gsub(/(?=s\b)(?<=Jeff)/,"'")
 => "See Jeff's book and it seems fine!" 
于 2011-03-17T20:08:33.540 に答える