264

私はjQueryを使用しています。特殊文字(開始と終了)のブロックを含む文字列があります。その特殊文字ブロックからテキストを取得したい。文字列内検索に正規表現オブジェクトを使用しました。しかし、2つ以上の特殊文字がある場合に複数の結果を見つけるようにjQueryに指示するにはどうすればよいですか?

私のHTML:

<div id="container">
    <div id="textcontainer">
     Cuộc chiến pháp lý giữa [|cơ thử|nghiệm|] thị trường [|test2|đây là test lần 2|] chứng khoán [|Mỹ|day la nuoc my|] và ngân hàng đầu tư quyền lực nhất Phố Wall mới chỉ bắt đầu.
    </div>
</div>

と私のJavaScriptコード:

$(document).ready(function() {
  var takedata = $("#textcontainer").text();
  var test = 'abcd adddb';
  var filterdata = takedata.match(/(\[.+\])/);

  alert(filterdata); 

  //end write js 
});

私の結果は次のとおりです。しかし、これは私が望む結果ではありません:(。1回目の[テキスト]と2回目の[デモ]を取得する方法は?


インターネットで情報を検索した後、仕事を終えたところです^^。私は次のようなコードを作成します:

var filterdata = takedata.match(/(\[.*?\])/g);
  • 私の結果は次のとおりです:[|cơthử|nghiệm|]、[| test2|đâylàtestlần2|] これは正しいです! 。しかし、私はこれを本当に理解していません。私の理由に答えてもらえますか?
4

3 に答える 3

565

非欲張り正規表現修飾子は、欲張りカウンターパートに似ていますが、?直後に続きます。

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)
于 2010-05-13T03:50:26.407 に答える
41

あなたは、貪欲が問題であることは正しいです:

--A--Z--A--Z--
  ^^^^^^^^^^
     A.*Z

両方を一致させたい場合はA--Z、を使用する必要がありますA.*?Z?は、*「気が進まない」、または怠惰になります)。

ただし、これを行うには、より良い方法がある場合があります。

A[^Z]*+Z

これは、否定された文字クラスと所有格の数量詞を使用して、バックトラックを減らし、より効率的になる可能性があります。

あなたの場合、正規表現は次のようになります。

/(\[[^\]]++\])/

残念ながら、 Javascript正規表現は所有格の数量詞をサポートしていないため、次のことを行う必要があります。

/(\[[^\]]+\])/

も参照してください


クイックサマリー

*   Zero or more, greedy
*?  Zero or more, reluctant
*+  Zero or more, possessive

+   One or more, greedy
+?  One or more, reluctant
++  One or more, possessive

?   Zero or one, greedy
??  Zero or one, reluctant
?+  Zero or one, possessive

気が進まない所有格の数量詞は、有限反復構造にも適用できることに注意してください{n,m}

Javaでの例:

System.out.println("aAoZbAoZc".replaceAll("A.*Z", "!"));  // prints "a!c"
System.out.println("aAoZbAoZc".replaceAll("A.*?Z", "!")); // prints "a!b!c"

System.out.println("xxxxxx".replaceAll("x{3,5}", "Y"));  // prints "Yx"
System.out.println("xxxxxx".replaceAll("x{3,5}?", "Y")); // prints "YY"
于 2010-05-13T04:00:12.807 に答える
3

こんな感じになると思います

takedata.match(/(\[.+\])/g);

最後のgはグローバルを意味するので、最初の試合で止まりません。

于 2010-05-13T03:52:15.793 に答える