3

私は次のJavaScriptコードを持っています:

<script type="text/javascript"> //javascript starts

 var patt=/[<](\S+).*>(.*)<\/\1>/;
 var str='<a id="test">hi</a> <p></p>';

 alert(str.match(patt));
 alert(patt.exec(str));

</script>

htmlドキュメント内のすべてのタグを見つけることが期待されています。したがって、理想的にはそれが返されるはず<a id="test">hi</a>, <p></p>です。

ただし、現在はを返します<a id="test">hi</a>, a ,hi

なぜこうなった?

また、別の質問、ととの違いは何ですか?どちらstr.match(patt)patt.exec(str)使用するのが良いですか?

4

3 に答える 3

2
var patt=/[<](\S+).*>(.*)<\/\1>/g;

修飾子を指定してみてくださいglobal(または、最初に見つかった場所で停止します)。

2番目の質問についてMDNは優れたリソースです:https
://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/match から

正規表現にフラグが含まれていない場合は、gregexp.exec(string)と同じ結果を返します。正規表現にgフラグが含まれている場合、メソッドはすべての一致を含む配列を返します。一致するものがなかった場合、メソッドはnullを返します。

于 2012-06-04T16:29:10.800 に答える
1

g正規表現にグローバル修飾子、を追加する必要があります/[<](\S+).*>(.*)<\/\1>/g

  • gグローバル修飾子をmatch使用せず、文字列内の最初の一致全体execを含む配列を最初の要素として返し、その後に、一致内の括弧で囲まれた一致パターンを後続の配列要素として返します。

  • g修飾子を使用するmatchexec、文字列からすべての一致が取得されます。 matchそれらを配列として返し、exec一致ごとに1つの配列を返します(一致パターンあり、なしの場合と同様g)が、への複数の呼び出しは、execすべての一致が報告されるまで、それぞれ異なる一致を返します(例については以下を参照)。

一般に、状態を維持する正規表現(具体的には、一致を再開する文字列のインデックス)に依存するため、よりもお勧めmatchします。複数の文字列で正規表現を使用する場合、これは有害であることがわかります。execexeclastIndex

var reg = /\w/g;
reg.exec("foo"); // ["f"]
reg.exec("foo"); // ["o"]
reg.exec("bar"); // ["r"] -- does not start at the beginning of the string

それを動作と比較してくださいmatch

var reg = /\w/g;
"foo".match(reg); // ["f", "o", "o"]
"bar".match(reg); // ["b", "a", "r"]
// we can now use the arrays to get individual matches

ただし、グローバル検索で一致ごとに括弧で囲まれた一致パターンを取得する必要がある場合は、を使用する必要があります。これは、のグローバルアプリケーションは一致全体のリストのみを取得し、それらの一致との一致パターンは取得しないためです。execmatch

// the ending digit is a match pattern
var reg = /\w(\d)/g;

// match only gets list of whole matches
"d1b4h7".match(reg); // ["d1","b4","h7"] 

// exec gets the match and the match pattern
reg.exec("d1b5h7"); // ["d1","1"]
reg.exec("d1b5h7"); // ["b4","4"]
reg.exec("d1b5h7"); // ["h7","7"]

結論としてmatch、一致パターン情報は必要ないため、グローバル修飾子を使用したいようです。実際に一致パターン情報が必要な場合は、配列の代わりにが返さexecれるまで、ループを使用して繰り返し呼び出すことにより、すべての一致を取得します。execnull

于 2012-06-04T16:55:46.013 に答える
0

これを試して:

var patt=/<\S+[^>]*>[^<]*<\/\S+>/g;

余分なaものhiは、キャプチャグループとして持っていたためにあります。これはタグのみを返します。それが持っている1つの欠陥はそれが一致すること<begin>dfgdf</diffEnd>です。

于 2012-06-04T16:49:40.810 に答える