1

RegEx を使用して長い文字列を検索しようとしていますが、式が思い浮かびません。特定の値を含むタグで始まり、別の値を含む別のタグで終わる一連のタグを HTML で検索しようとしています。これを試みるために現在使用しているコードは次のとおりです。

matcher = new RegExp(".*(<[^>]+" + startText + "((?!" + endText + ").)*" + endText + ")", 'g');

data.replace(matcher, "$1");

真ん中あたりの奇妙さ ( ) は、私の問題を説明しているように見える((\\?\\!endText).)*別のスレッドから借用したものです。私が直面している問題は、式が開始タグと一致するが、終了タグが見つからず、代わりに残りのデータが含まれていることです。また、途中で見回すと、表現が大幅に遅くなりました。これを機能させる方法について何か提案はありますか?

編集: RegEx で HTML を解析するのが最善の選択肢ではないことは理解しています (汚い気分になります)。その場で作成しているため、解析するマークアップがどのように見えるかを正確に言うのは困難です。私にできる最善のことは、さまざまな日付のさまざまなアイテムについて収集された大きなデータ テーブルを見ているということです。これらの範囲は両方とも異なる可能性があり、単一の行から特定の範囲の日付を選択しようとしています。startTextとのおおよその値endText\\@\\@ASSET_ID\\@\\@_<YYYY_MM_DD>. アイデアは、このセル範囲に対応するコードを見つけることです。(この編集により、これがさらに混乱する可能性がありますが、アプリケーション全体を説明せずに、実際にどれだけ多くの情報を提供できるかわかりません)。

編集: まあ、これはばかげた質問でした。.*どうやら、最後の括弧の後に追加するのを忘れていました。これにこんなに長い時間を費やしたなんて信じられない!助けようとした人に感謝します!

4

1 に答える 1

3

まず.*、冒頭にドットアスタリスクがあるのはなぜですか?次のようなテキストがある場合:

This is my Text

そして、あなたは「私のテキスト」を引き出したいと思っていますmy\sText. する必要はありません.*

そうは言っても、今は必要なものだけを照合するため、「すべて」の周りにメインのキャプチャ グループは必要ありません。This:.*(xxx)は非常に厳禁であり、ほとんどの場合、 this: に置き換えることができますxxx。つまり、正規表現は次のものに置き換えることができます。

<[^>]+xxx((?!zzz).)*zzz

そこから、私はそれが何をしているのかを調べます。

  1. HTML の開始 Delimeter を探しています<。あなたはそれを消費します。
  2. クロージング HTML デリメータではない文字を少なくとも 1 文字使用しますが、多くの文字を使用できます。<table border=2>あなたのタグ<t
  3. StartText を探しています。その StartText がtableである場合、t. したがって、それ+を に置き換え*ます。
  4. アスタリスクが貪欲であるため、次が終了テキストではなく、ドキュメントの VERY END から開始する場合、正規表現は引き続き成功します。を追加して遅延させることをお勧めし?ます。
  5. バックトラッキングが失敗すると、終了テキストが検索され、正常に収集されます。

そのロジックの結果:

<[^>]*xxx((?!zzz).)*?zzz

とにかくドットを使用する場合は、新しい Regex ライターには問題ありませんが、ベテランには推奨されません。私はこれを使用します。

<[^>]*xxx.*?zzz

したがって、Javascript の場合、コードは次のようになります。

matcher = new RegExp("<[^>]*" + startText + ".*?" + endText, 'gi');

私は IgnoreCase の "i" をそこに入れましたが、それが必要な場合とそうでない場合があります。

于 2013-08-12T22:25:29.947 に答える