3

テキスト ファイル内のすべての URL を正しく検索する正規表現があるとします。

(http://)([a-zA-Z0-9\/\.])*

URL ではなく、その逆 (URL 以外のすべてのテキスト) が必要な場合、これを取得するための簡単な変更はありますか?

4

4 に答える 4

4

何らかの理由で正規表現のみのソリューションが必要な場合は、これを試してください。

((?<=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のケースに引っかかる可能性があります) 。

もちろん修正大歓迎です!

于 2009-07-17T02:39:03.240 に答える
0

これが意図したとおりに機能するかどうかはわかりませんが、役立つかもしれません。括弧 [] 内に何を入れても一致します。[^a-zA-Z0-9/.] のように角括弧内に ^ を入れると、角括弧内以外のすべてに一致します。

http://www.regular-expressions.info/

于 2009-07-17T01:17:57.003 に答える