4

WebページからURLを解析する方法に関するこの質問を読んでいて、この解決策を提供する受け入れられた回答について質問がありました:

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

ソリューションは csmba によって提供され、彼はそれをregexlib.comにクレジットしました。うわー。クレジット完了。

これはかなり素朴な正規表現だと思いますが、より良いものを構築するための良い出発点です。しかし、私の質問はこれです:

のポイントは{1}何ですか?「ちょうど前のグループの 1 つ」という意味ですよね?それは正規表現でのグループ化のデフォルトの動作ではありませんか? が削除された場合、表現は何らかの方法で変更さ{1}れますか?

同僚からこれを見た場合、私は彼または彼女のエラーを指摘しますが、これを書いているとき、応答は 6 と評価され、regexlib.com の式は 5 の 4 と評価されています。

4

4 に答える 4

3

@ロブ: 私は同意しません。あなたが求めていることを強制するには、否定的な後読みを使用する必要があると思います。これは可能ですが、{1} の使用とは関係ありません。正規表現のどちらのバージョンもその特定の問題に対処していません。

コードが話すようにするには:

tibook 0 /home/jj33/swap > cat text
Text this is http://example.com text this is
Text this is http://http://example.com text this is
tibook 0 /home/jj33/swap > cat p
#!/usr/bin/perl

my $re1 = '((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)';
my $re2 = '((mailto\:|(news|(ht|f)tp(s?))\://)\S+)';

while (<>) {
  print "Evaluating: $_";
  print "re1 saw \$1 = $1\n" if (/$re1/);
  print "re2 saw \$1 = $1\n" if (/$re2/);
}
tibook 0 /home/jj33/swap > cat text | perl p
Evaluating: Text this is http://example.com text this is
re1 saw $1 = http://example.com
re2 saw $1 = http://example.com
Evaluating: Text this is http://http://example.com text this is
re1 saw $1 = http://http://example.com
re2 saw $1 = http://http://example.com
tibook 0 /home/jj33/swap >

そのため、2 つのバージョンに違いがある場合、それはあなたが提案したものではないようです。

于 2008-08-17T02:46:42.740 に答える
2

{1} がその正規表現で有効な機能を持っているとは思いません。

(**mailto:|(news|(ht|f)tp(s?)):// ){1}**

これは次のように読む必要があります: 「括弧内のものを 1 回だけキャプチャする」。しかし、後で使用するためにこれをキャプチャすることはあまり気にしません。たとえば、$1 を置換します。だから無意味です。

于 2008-08-17T02:58:18.083 に答える
1

何の目的もないと思います。しかし、正規表現を理解/分解することはほとんど不可能であるため、人々がエラーを指摘することはめったにありません。それがおそらく他の誰もそれを指摘しなかった理由です。

于 2008-08-17T02:18:06.773 に答える
1

@Jeff Atwood、あなたの解釈は少しずれています-{1}は正確に1回一致することを意味しますが、「キャプチャ」には影響しません-括弧が原因でキャプチャが発生します-中括弧はパターンが一致する必要がある回数のみを指定しますソース - あなたが言うように、一度。

彼の答えが少し簡潔で、軽薄であると思われるかもしれませんが、@Mariusに同意します。正規表現の使用に慣れていない場合、正規表現は難しく、質問の {1} はエラーではありません。それをサポートするシステムでは、「正確に 1 つの一致」を意味します。この意味で、それは本当に何もしません。

残念ながら、現在削除された投稿とは対照的に、最後の \S+ はinhttp://http://example.orgを含む 1 つ以上の非空白文字と一致するため、正規表現が一致することはありません(念のため Python 2.5 を使用して検証済み)。正規表現の読み取りはオフでした)。したがって、指定された正規表現は実際には最適ではありません。私は URL の専門家ではありませんが、適切な URL を確保するには、最初の文字列の後の ":" と "//" の表示を制限する必要があるでしょう (ただし、十分ではありません)。http://example.orghttp://http://example.org

于 2008-08-17T02:56:56.337 に答える