0

「RioGrandeDoLeste」を次の場所からキャプチャしようとしています。

...
<h1>Rio Grande Do Leste<br />
...

を使用して

var myregexp = /<h1>()<br/;

var nomeAldeiaDoAtaque = myregexp.exec(document);

私は何が間違っているのですか?

アップデート:

2つの質問が残っています:

1)(document)を検索しても結果は得られませんでしたが、(document.body.innerHTML)に変更すると機能しました。何故ですか?

2)次のように変更する必要がありました:myregexp.exec(document.body.innerHTML)[1] ; 私が欲しいものを手に入れるために、そうでなければそれは私にを含むいくつかの結果を与えるでしょう<h1>。何故ですか?

3)(回答済み)なぜ「。*」を使用する必要があるのですか?()の間に何かを集めると思いましたか?

4

3 に答える 3

8

試してみてください/<h1>(.*?)<br/

于 2010-07-04T17:45:50.243 に答える
5

グループのキャプチャについて

キャプチャグループは、一致するものをキャプチャしようとします。これにはいくつかの重要な結果があります。

  • 何にも一致しないグループは、何もキャプチャできません。
  • 空の文字列にのみ一致するグループは、空の文字列のみをキャプチャできます。
  • 試合の試みで繰り返しキャプチャするグループは、最後のキャプチャのみを保持します
    • 通常、ほとんどのフレーバーに当てはまりますが、.NET正規表現は例外です(関連する質問を参照)

これは、2つのキャプチャグループを含む単純なパターンです。

(\d+) (cats|dogs)
\___/ \_________/
  1        2

与えられ i have 16 cats, 20 dogs, and 13 turtlesた場合、2つの一致があります(rubular.comで見られるように):

  • 16 cats一致します:グループ1がキャプチャ16、グループ2がキャプチャcats
  • 20 dogs一致します:グループ1がキャプチャ20、グループ2がキャプチャdogs

ここで、パターンのこのわずかな変更について考えてみましょう。

(\d)+ (cats|dogs)
\__/  \_________/
 1         2

これで、グループ1が一致\dします。つまり1桁です。ほとんどのフレーバーでは、繰り返し一致するグループ(この場合はのおかげで+)は最後の一致のみを保持します。したがって、ほとんどのフレーバーでは、一致した最後の数字のみがグループ1によってキャプチャされます(rubular.comで見られるように)。

  • 16 cats一致します:グループ1がキャプチャ6、グループ2がキャプチャcats
  • 20 dogs一致します:グループ1がキャプチャ0、グループ2がキャプチャdogs

参考文献


貪欲vs嫌悪vs否定のキャラクタークラスについて

A次に、「との間のすべて」を一致させる問題について考えてみましょうZZ。結局のところ、この仕様はあいまいです。これを行う3つのパターンを考え出し、それらは異なる一致を生成します。どちらが「正しい」かは、元のステートメントでは適切に伝えられていない期待に依存します。

入力として以下を使用します。

eeAiiZooAuuZZeeeZZfff

3つの異なるパターンを使用します。

  • A(.*)ZZ1つの一致が得られます: AiiZooAuuZZeeeZZ( ideone.comで見られるように
    • これは貪欲な変種です。グループ1が一致し、キャプチャされましたiiZooAuuZZeee
  • A(.*?)ZZ1つの一致が得られます: AiiZooAuuZZ( ideone.comで見られるように
    • これはが進まない変種です。グループ1が一致し、キャプチャされましたiiZooAuu
  • A([^Z]*)ZZ1つの一致が得られます: AuuZZ( ideone.comで見られるように
    • これは否定された文字クラスのバリアントです。グループ1が一致し、キャプチャされましたuu

それらが一致したものを視覚的に表現したものは次のとおりです。

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g

これらの3つの手法の違いに関するより詳細な取り扱いについては、関連する質問を参照してください。

関連する質問


質問に戻る

それでは、質問に戻って、パターンの何が問題になっているのかを見てみましょう。

<h1>()<br
    \/
     1

グループ1は空の文字列と一致するため、パターン全体は全体としてのみ一致<hr1><brし、グループ1は空の文字列のみと一致します。

これをさまざまな方法で「修正」することができます。試してみるべき3つの明らかなものは次のとおりです。

  • <h1>(.*)<br; よく深い
  • <h1>(.*?)<br; 気が進まない
  • <h1>([^<]*)<br; 否定された文字クラス

上記のいずれも常に「機能」しないことがわかります。一部のHTMLで問題が発生します。これは予想されることです。正規表現は、この仕事にとって「間違った」ツールです。パターンをますます複雑にして、「正しい」頻度と「間違った」頻度を減らすことができます。おそらく、誰も理解および/または維持できない恐ろしい混乱に陥り、それでも100%の確率で「正しく」機能しない可能性があります。

于 2010-07-04T18:54:25.093 に答える
-1

また

^(<h1>)(.)+(<br />)

gskinner.comをテストするにはここにアクセスしてください

于 2010-07-04T17:55:14.000 に答える