4

私は現在正規表現を学んでおり、 notepad++を使用してドキュメントからすべてのリンク (例: http://www.link.com/folder/file.html ) をフィルタリングしようとしています。実際には、最終的にhttpリンクのみがリストされるように、他のすべてを削除したいと思います。

これまでのところ、私はこれを試しました:http\:\/\/www\.[a-zA-Z0-9\.\/\-]+

これにより、見つかったすべてのリンクが表示されますが、残りのものを削除して、最終的にすべてのリンクのきちんとしたリストを取得するにはどうすればよいですか?

それを何も置き換えずに \1 を続けようとすると、明らかにリンクが削除されますが、正反対の方法で他のすべてを削除したいと考えています。

- 「http」までの数字、文字、および特殊記号の文字列を見つけます - 見つけたものを削除します - そして「html」の後の数字、文字、および特殊記号をさらに検索し続けます - そしてそれをもう一度削除します

何か案は?本当にありがとう。

4

5 に答える 5

12

Notepad++ では、[置換] メニュー (CTRL+H) で次の操作を実行できます。

  • 探す:.*?(http\:\/\/www\.[a-zA-Z0-9\.\/\-]+)
  • 交換:$1\n
  • オプション: と をチェックしますRegular expression. matches newline

これにより、すべてのリンクのリストが返されます。ただし、次の 2 つの問題があります。

  1. URL を一致させるために提供した正規表現は、任意の URL に一致するほど一般的ではありません。あなたのケースで機能している場合は問題ありません。それ以外の場合は、この質問を確認してください。
  2. 最後に一致した URL の後のテキストはそのまま残ります。手動で削除する必要があります。
于 2013-11-01T00:12:17.440 に答える
0

残念ながら、この一見単純な作業は、notepad++ ではほとんど不可能です。あなたが構築しなければならない正規表現は...恐ろしいでしょう。それは不可能かもしれませんが、可能であれば、それだけの価値はありません。私はそれをかなり保証します。

しかし、すべてが失われるわけではありません。この問題により適した他のツールがあります。

本当に欲しいのは、入力ファイルを検索して正規表現のリストを出力できるツールです。UNIX ユーティリティの「grep」はまさにそれを行います。これは UNIX ユーティリティなので、心配しないでください。Windows 用に入手できます。

http://gnuwin32.sourceforge.net/packages/grep.htm

使用する grep コマンド ラインは次のとおりです。

grep -o 'http:\/\/www.[a-zA-Z0-9./-]\+\?' <filename(s)>

(URL を検索するファイルの名前はどこ<filename(s)>にありますか。)

正規表現を少し変更することもできます。その正規表現で見られる問題は、「www」サブドメインのない URL を処理しないことと、安全なリンク (で始まるhttps) を処理しないことです。多分それはあなたが望むものですが、そうでない場合は、次のように変更します。

grep -o 'https\?:\/\/[a-zA-Z0-9./-]\+\?' <filename(s)>

これらの表現について、次の点に注意してください。

  1. [文字グループ内では、 and (場合によっては)を除いてメタ文字を引用する必要はありません-。上記のようにダッシュを最後に置くと、範囲演算子として解釈されなくなるため、時々言います。

  2. grep ユーティリティの構文は、厄介なことに、ほとんどの正規表現の実装とは異なり、使い慣れたメタ文字 ( ?+など)のほとんどを使用するにはエスケープする必要があり、その逆ではありません。?上記のおよび文字の前にバックスラッシュが表示されるのはそのためです+

  3. 最後に、この式の繰り返しメタ文字 ( +) はデフォルトで貪欲であり、問​​題を引き起こす可能性があります。a を追加して遅延させ?ました。URL の一致を定式化した方法では、おそらく問題は発生しませんでしたが、たとえば[^ ]の代わりに一致を に変更する[a-zA-Z0-9./-]と、同じ行の URL が結合されていることがわかります。

于 2013-10-31T22:00:02.837 に答える
0

私はこれを別の方法で行いました。
最初/次 (https または http) まで (次に続くすべて) から (html または htm) までのすべてを検索し、「(https または http)(次のすべて) 次に (html または htm)」のみを出力します。それぞれの後に改行/キャリッジリターン。

だから:
検索:.*?(https:|http:)(.*?)(html|htm)
置換:\1\2\3\r\n

すべての可能な (非ジェネリックを含む) URL の一致を検索して保存します。

最後に一致した URL の後のテキストを手動で削除する必要があります。

URL リンクの作成にも使用できます:
検索:.*?(https:|http:)(.*?)(html|htm)
置換:<a href="\1\2\3">\1\2\3</a>\r\n

または画像リンク (jpg/jpeg/gif):
検索:.*?(https:|http:)(.*?)(jpeg|jpg|gif)
置換:<img src="\1\2\3">\r\n

于 2019-05-03T16:23:16.087 に答える
0

以前に @psxls が行った回答は、同様のプロセスを実行したいときに非常に役立ちました。

ただし、このregexルールは 6 年前に作成されたものです。したがって、最近のリンクで適切に機能するように、調整/完了/更新する必要がありました。理由は次のとおりです。

  1. 現在、多くの URL がプロトコルHTTPSの代わりに使用されていますHTTP
  2. 多くのウェブサイトがwwwメインのサブドメインとしてあまり使用されていません
  3. 一部のリンクには句読点が追加されています (保持する必要があります)。

最終的に検索ルールを再シャッフルする.*?(https?\:\/\/[a-zA-Z0-9[:punct:]]+)と、持っていたファイルで正しく機能しました。

于 2019-02-21T15:00:49.020 に答える