1
    ([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)

そしてこれ:

    ([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)

そして、それはどのように一致しますか?開始部分が空白を取り除くと確信しています..またはそうですか?

ありがとう。

4

2 に答える 2

4

これら 2 つはひどい正規表現です。どこで見つけましたか?

まず、 の代わりに、単純に(= 1 つまたは複数の非空白文字)[^\s]+と書くことができます。\S+

2 番目の部分(?=\.(jpg|jpeg|png|gif))は、文字列の前方を調べて、文字列の次の部分がドットであり、その後にリストされているグラフィックス ファイル名拡張子の 1 つが続くことを確認します。

次に、\.\2まったく同じテキストに一致するため、前の先読みアサーションは完全に無意味になります。\2は、キャプチャ括弧の 2 番目のペア ( の周りのものjpg|jpeg|png|gif) の内容を参照します。

したがって、最初の正規表現は次のように書き直すことができます。

\S+\.(jpe?g|png|gif)

\12番目のものは、正規表現全体を(完全に無用に)囲む最初の括弧のセットの内容を参照するため、一致することはありません(すべてではないにしても、ほとんどのコンパイラが咳をして死にます) 。もちろん、マッチ全体をそれ自体の一部として含めることはできません。

于 2012-08-24T20:07:58.010 に答える
3
  • [^\s]+- 空白以外の 1 つ以上の文字に一致します。
  • (?=\.(jpg|jpeg|png|gif)- ゼロ幅 (入力を消費しないことを意味する) の正の先読み。上記の式の後に、ドット ( ) があり、その後に 4 つの画像拡張子が続くことをアサートします。\.
  • \.\2- ドットに一致し、その後に 2 番目にキャプチャされたグループである(jpg|jpeg|png|gif).

要するに、([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)は 1 つ以上の非空白文字 (おそらくファイル名) に一致し、その後に次の拡張子のいずれかが続きます: .jpg.jpeg.png、または.gif.

2 つ目も基本的には同じですが、\1キャプチャしたテキスト全体を参照するため、何にも一致しません。

于 2012-08-24T20:06:15.313 に答える