0

かなり前から正規表現のスキルを磨きたいと思っていましたが、「正規表現をマスターする」が何度も勧められたので、購入してこの1日ほど読んでいます。

次の正規表現を作成しました。

^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$

<i>これは最初の2つのリンクに一致しますが、タグで囲まれた2つを無視します。ID、タイトル、タイプを抽出します。

<a href="/site.php?id=6321">site 1 title (type 1)</a>
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b>

<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i>
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b>

それは機能しますが、非常に単純なものにはかなり長いようですが、改善できるでしょうか?

4

2 に答える 2

5

文字クラスを使用しない場合(0〜9の場合は\ dなど)問題の正規表現を大幅に短縮できるとは思いません。でも...

補足として、正規表現を使用してHTMLを解析することはせいぜい危険であることに言及する価値があります。HTML(および程度は少ないがXML)を扱う場合は、一般にDOMツールの方が適しています。

于 2009-07-13T17:55:59.120 に答える
1

Whillihamが正しく言及しているようにスクリーンスクレーパーを作成する場合、HTMLは正規表現よりもはるかに寛容であるため、DOMは正規表現として適切なパーサーである可能性があります。

それほど短縮されていませんが、正規表現は少し寛容です

  • 文字列の開始と文字列の終了のチェッ​​クを削除しましたが、本当に必要でしたか?
  • ネガティブルックビハインドが<a>先行していないことを確認する<i>
  • [0-9]tadcleanerの代わりに\dの単純なアサーションを使用します。
  • 3〜11文字入力しましたが、3文字以上に変更しました。
  • 終了タグのチェックを削除しました。これらは、スクリーンスクレーパーにとってコンテキスト上の意味を持ちません(おそらく)。

(?<!<i>)<a href="/site.php\?id=(\d*)">(.*?) \(([ a-z\d]{2,})\)

于 2009-07-13T18:11:27.433 に答える