テキスト ファイル内のすべての URL を正しく検索する正規表現があるとします。
(http://)([a-zA-Z0-9\/\.])*
URL ではなく、その逆 (URL 以外のすべてのテキスト) が必要な場合、これを取得するための簡単な変更はありますか?
テキスト ファイル内のすべての URL を正しく検索する正規表現があるとします。
(http://)([a-zA-Z0-9\/\.])*
URL ではなく、その逆 (URL 以外のすべてのテキスト) が必要な場合、これを取得するための簡単な変更はありますか?
何らかの理由で正規表現のみのソリューションが必要な場合は、これを試してください。
((?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%]))|\A(?!http://[a-zA-Z0-9\/\.#?/%])).+?((?=http://[a-zA-Z0-9\/\.#?/%])|\Z)
URL 文字のセットを少し ( [a-zA-Z0-9\/\.#?/%]
) 拡張して、いくつかの重要な文字を含めましたが、これは決して正確または網羅的なものではありません。
正規表現は少しモンスターなので、分解してみます。
(?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%])
最初の部分は URL の末尾に一致します。http://[a-zA-Z0-9\/\.#?/%]+
は URL 自体に一致します(?=[^a-zA-Z0-9\/\.#?/%])
が、最後にいることを確認できるように、URL の後に URL 以外の文字が続く必要があることを表明します。URL 以外の文字を検索するがキャプチャしないように、先読みが使用されます。すべてが後読みでラップされ(?<=...)
、一致の境界としてそれを探しますが、その部分をキャプチャすることはありません。
また、ファイルの先頭にある非 URL と一致させたいと考えています。\A(?!http://[a-zA-Z0-9\/\.#?/%])
ファイルの先頭 ( ) と一致し\A
、その後に否定先読みが続き、ファイルの先頭に URL が潜んでいないことを確認します。(この URL チェックは最初のものよりも簡単です。必要なのは URL の全体ではなく先頭だけだからです。)
これらのチェックは両方とも括弧に入れられ、文字OR
と一緒に 'd されます。|
その後、.+?
キャプチャしようとしている文字列に一致します。
次に、 に行き((?=http://[a-zA-Z0-9\/\.#?/%])|\Z)
ます。ここで、もう一度 を使用して、URL の先頭を確認します(?=http://[a-zA-Z0-9\/\.#?/%])
。ファイルの終わりは、マッチの終わりに達したことを示す良い兆候でもあります\Z
。最初の大きなグループと同様に、括弧で囲みOR
、2 つの可能性をまとめます。
シンボルには|
優先順位が非常に低いためかっこが必要ですOR
。
\A
この正規表現は、ゼロ幅のアサーション (および\Z
アンカー、およびルックアラウンド グループ) に大きく依存しています。正規表現を深刻なものや永続的なものに使用する前に、常に正規表現を理解する必要があります (そうしないと、 perlのケースに引っかかる可能性があります) 。
もちろん修正大歓迎です!
これが意図したとおりに機能するかどうかはわかりませんが、役立つかもしれません。括弧 [] 内に何を入れても一致します。[^a-zA-Z0-9/.] のように角括弧内に ^ を入れると、角括弧内以外のすべてに一致します。