([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
そしてこれ:
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)
そして、それはどのように一致しますか?開始部分が空白を取り除くと確信しています..またはそうですか?
ありがとう。
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
そしてこれ:
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)
そして、それはどのように一致しますか?開始部分が空白を取り除くと確信しています..またはそうですか?
ありがとう。
これら 2 つはひどい正規表現です。どこで見つけましたか?
まず、 の代わりに、単純に(= 1 つまたは複数の非空白文字)[^\s]+
と書くことができます。\S+
2 番目の部分(?=\.(jpg|jpeg|png|gif))
は、文字列の前方を調べて、文字列の次の部分がドットであり、その後にリストされているグラフィックス ファイル名拡張子の 1 つが続くことを確認します。
次に、\.\2
まったく同じテキストに一致するため、前の先読みアサーションは完全に無意味になります。\2
は、キャプチャ括弧の 2 番目のペア ( の周りのものjpg|jpeg|png|gif
) の内容を参照します。
したがって、最初の正規表現は次のように書き直すことができます。
\S+\.(jpe?g|png|gif)
\1
2番目のものは、正規表現全体を(完全に無用に)囲む最初の括弧のセットの内容を参照するため、一致することはありません(すべてではないにしても、ほとんどのコンパイラが咳をして死にます) 。もちろん、マッチ全体をそれ自体の一部として含めることはできません。
[^\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
キャプチャしたテキスト全体を参照するため、何にも一致しません。