.+?\.([\w-]*?\.(?:ru|ua|com\.ua|com|net|info))$
この回答では、元の質問で調べていた特定のドメイン名を引き続き使用しています。一部の TLD (トップ レベル ドメイン) にはピリオドが含まれており、理論的には複数のサブドメインを含むリストを作成できるため、正規表現で TLD をホワイトリストに登録することは、データ セットで機能する場合に適しています。現在の両方の回答 (2013 年以降) は、「xx.bb.prontube.ru」と「srfsf.jwbefw.com.ua」の違いを正しく処理しません。
この psnig の元の正規表現が意図したとおりに機能しない理由の簡単な説明を次に示し
ます+
。
.+
行の最後ですべてをキャプチャして右に移動し、次に後方 (左) に移動して、ここから一致するものを探します。
(ru|ua|com\.ua|com|net|info)
srfsf.jwbefw.com.uaでは、正規表現エンジンは最初に一致に失敗しa
、次にトークンを 1 つ左に移動して "ua" を確認します。その時点でua
、正規表現から (2 番目のオプション) が一致します。
「.ua」がその要件を満たしているため、エンジンは「com.ua」を探し続けません。
Niet the Dark Absol の答えは、正規表現が「怠け者」であることを示しており、
.+?
任意の文字 (少なくとも 1 つ) に一致し、正規表現の次の部分を見つけようとします。それが失敗した場合は、トークンを進めて、.+
もう 1 文字一致させてから、残りの正規表現を再度評価します。
.+? ピリオドに一致する前にsrfsf.jwbefwを消費し、次にcom.uaに一致します。
しかし、実装は?
問題も引き起こします。
疑問符を追加すると、最初の .+ が遅延しますが、その後 group1 がprontube.ruではなくbb.prontube.ruに一致するようになります。
これは、bb の後の最初のピリオドが一致し、次にグループ 1 内がbb.prontube(.*?)
と一致するためです。試合前.ru\.(ru|ua|com\.ua|com|net|info))$
これを回避するには、3 番目のグループを から(.*?)
に変更して、([\w-]*?)
をキャプチャしないようにします。文字と数字、またはダッシュのみ。
結果の正規表現:
.+?\.(([\w-])*?\.(ru|ua|com\.ua|com|net|info))$
最初のグループ以外はキャプチャする必要がないことに注意してください。?: を追加すると、TLD オプションが非キャプチャになります。
最後の変更:
.+?\.([\w-]*?\.(?:ru|ua|com\.ua|com|net|info))$