10

正規表現/'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
とテストコードがあります('He said, "You're cool."' , 'Rawr')
(テストコードは、関数に渡されるパラメーターをシミュレートします)。

正規表現を理解した上で説明します。問題に光を当てることができれば幸いです。

1)/'一致した文字列の先頭にある必要があることを意味します'

2)0回以上(.*)を除くすべての文字をキャプチャすることを意味します 3)キャプチャしないことを意味しますが、ステップ4を実行してみてください。うまくいかない場合は、ステップ54を試してください 。 )はキャプチャしないことを意味しますが、0個以上の空白文字を含むaが必要であり、その後に0個以上の空白文字を含むaが続く必要があります 5)キャプチャしないことを意味しますが、\n

(?:(?:4)|(?:5))

(?:'\s*,\s*)',

(?:'\))')

したがって、これを返す必要があるようです(これが私が望むものです):
'+ He said, "You're cool."+' ,
しかし、それは戻ります:
'+ He said, "You're cool."' , 'Rawr+')

テストコードを('He said, "You're cool."' , 'Rawr'(終了括弧なし)に変更すると、必要なものが返されますが、それを追加するとすぐに最後の括弧、それから私のOR演算子はそれがやりたいことを何でもしているようです。最初にカンマがあるかどうかをテストし、カンマがある場合はそこで中断し、括弧が1つない場合はチェックします。

手順4と手順5のスポットを切り替えてみましたが、それでもOR演算子は常にデフォルトの(?:'\))側になっているようです。 可能な限り最短の金額に一致させるにはどうすればよいですか?

4

1 に答える 1

23

あなたの問題はOR演算子ではないと思いますが、の貪欲さです.*。文字列全体と一致し、次の式が一致するまでバックトラックします。このバックトラッキングプロセスの最初の一致は'He said, "You're cool."' , 'Rawr+になります').*?代わりに試してください!

于 2012-08-29T16:16:54.897 に答える