メモ帳++の正規表現グループキャプチャ

このようなテキストファイルがあります。

ххх.prontube.ru
salo.ru
bbb.antichat.ru
yyy.ru
xx.bb.prontube.ru
zzz.com
srfsf.jwbefw.com.ua

このような正規表現を持つすべてのサブドメインを削除しようとしています。

Find:    .+\.((.*?)\.(ru|ua|com\.ua|com|net|info))$
Replace with: \1

受信してください。

prontube.ru
salo.ru
antichat.ru
yyy.ru
prontube.ru
zzz.com
com.ua

なぜ最後の行が jwbefw.com.ua ではなく com.ua になっているのですか?

これは周りを見渡さなくても効果があります。

Find: [a-zA-Z0-9-.]+\.([a-zA-Z0-9-]+)\.([a-zA-Z0-9-]+)$ Replace: 1.\2.

これは、少なくとも2つのピリオドがあり、最後の2つのピリオドの後に文字、数字、ダッシュだけがあるものを見つけ、最後の2つの部分で置き換えます。より直感的な方法だと思います。

先頭の xxx は何か変ですね。これはASCIIではないようです。この質問のために、私はこのサイトがおかしいだけで、あなたの実際のデータを代表しているわけではないと仮定しています。

不正解

興味深いことに、私は以前ここに多くのアップヴォートを蓄積した不正解を持っていました。だから、私はそれを維持するべきだと思います。

Find: [a-zA-Z0-9-]+\.([a-zA-Z0-9-]+)\.(.+)$ Replace: 1.\2.

これは、少なくとも2つのピリオドが含まれるホスト名を見つけて、最初のドット以降のすべてと置き換えるだけです。

解説 (0)

.+の部分は、可能な限りマッチングします。代わりに.+?を使ってみてください。そうすれば、可能な限り少なく捕捉し、com.ua` オプションをマッチさせることができます。

解説 (0)
.+?\.([\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&quotを探します。 その時点で、正規表現(2番目のオプション)のuaがマッチします。

エンジンは、".ua" がその条件を満たしているので、"com.ua" を見つけるために探し続けることはありません。

Niet the Dark Absoluteの答えは、正規表現に"lazy&quotを指示します。 .+?は任意の文字(少なくとも1つ)にマッチし、正規表現の次の部分を探そうとします。 それが失敗すると、トークンを進めて.+` がもう1文字にマッチし、正規表現の残りを再び評価します。
.+? は最終的に消費されます。ピリオドにマッチする前に srfsf.jwbefw を消費し、次に com.ua にマッチします。

しかし、?の実装はまた問題を引き起こします。

クエスチョンマークを追加すると、最初の .+ は無視されますが、group1 が prontube.ru ではなく bb.prontube.ru にマッチしてしまいます。

これは、bbの後の最初のピリオドがマッチし、グループ1内の (.*?)bb.prontube にマッチするからです。その前の .(ru|ua|com.ua|com|net|info))$.ru にマッチします。

これを避けるには、3番目のグループを (.*?) から ([\w-]*?) に変更して、.ru はアルファベットと数字、またはダッシュのみ捕捉されないようにします。

という正規表現が生成されます。 *`.+?╱(([\w-])?╱(ru|ua|com.ua|com|net|info))$** **.+?╱([\w-])*?

なお、1つ目以外のグループは捕捉する必要はありません。 を追加すると、TLDオプションはキャプチャされなくなります。

は最後の変更です。 *`.+?.([\w-]?.(?:ru|ua|com.ua|com|net|info))$** **.+?

解説 (0)