3

新しい状況が発生するまで完全に機能していた次の正規表現があります

^.*[?&]U(?:RL)?=(?<URL>.*)$

基本的に、これは URL に対して使用され、U= または URL= の後のすべてを取得し、URL 一致でそれを返します。

したがって、次の場合

http://localhost?a=b&u=http://otherhost?foo=bar

URL = http://otherhost?foo=bar

残念ながら、奇妙なケースが出てきました

http://localhost?a=b&u=http://otherhost?foo=bar&url=http://someotherhost

理想的には、URL を " http://otherhost?foo=bar&url=http://someotherhost " にしたいのですが、代わりに " http://someotherhost "だけにします。

編集:これで修正されたと思います...きれいではありませんが

^.*[?&](?<![?&]U(?:RL)?=.*)U(?:RL)?=(?<URL>.*)$
4

1 に答える 1

9

問題

問題は、それ.*が十分に貪欲ではないということではありません。先に登場したもう一方 貪欲だということです。.*

この問題を説明するために、別の例を考えてみましょう。次の2つのパターンを検討してください。\12番目のパターンに抵抗があることを除いて、それらは同一です。

              \1 greedy, \2 greedy         \1 reluctant, \2 greedy
              ^([0-5]*)([5-9]*)$           ^([0-5]*?)([5-9]*)$

ここに2つのキャプチャグループがあります。\1をキャプチャし[0-5]*、を\2キャプチャし[5-9]*ます。これらのパターンが一致してキャプチャするものを並べて比較すると、次のようになります。

              \1 greedy, \2 greedy          \1 reluctant, \2 greedy
              ^([0-5]*)([5-9]*)$            ^([0-5]*?)([5-9]*)$
Input         Group 1    Group 2            Group 1    Group 2
54321098765   543210     98765              543210     98765
007           00         7                  00         7
0123456789    012345     6789               01234      56789
0506          050        6                  050        6
555           555        <empty>            <empty>    555
5550555       5550555    <empty>            5550       555

貪欲なまま\2、最初につかんでいないものしかつかめ\1ないことに注意してください!したがって、できるだけ\2多くのグラブを作成したい場合は、気が進まないようにする必要があるため、実際には。5\15\2

添付ファイル

関連する質問


修正

したがって、これを問題に適用すると、これを修正する方法が2つあります。最初の方法を気が進まないようにすることができます.*rubular.comを参照)。

^.*?[?&]U(?:RL)?=(?<URL>.*)$

または、プレフィックス一致部分を完全に削除することもできます(rubular.comを参照)。

[?&]U(?:RL)?=(?<URL>.*)$
于 2010-06-15T14:14:56.433 に答える