0

挙動がわかりません。そのような例があり、html コメントをキャッチする必要があります。

var str = '.. <!--My -- comment test--> ';

var regex1 = /<!--[.]*-->/g;
var regex2 = /<!--.*-->/g;

alert(str.match(regex1));      // null
alert(str.match(regex2));      // <!--My -- comment test--> 

2 番目の正規表現regex2は正常に機能し、必要なものを正確に出力します。最初のショーnull。そして、私は違いを理解していません。RegExpressions<!--[.]*--><!--.*-->同じ意味です - 「<!--改行を除く任意の文字を 0 からできるだけ多く取り、」で終了し-->ます。しかし、2番目の場合は機能し、最初の場合は機能しません。なんで?

アップデート。コメントを読み、更新しました。

var str3 = '.. <!--Mycommenttest--> ';
var str4 = '.. <!--My comment test--> ';

var regex3 = /<!--[\w]*-->/g;
var regex4 = /<!--[\s\S]*-->/g;

alert(str.match(regex3));         // <!--Mycommentstest-->
alert(str.match(regex4));         // <!-- My comment test -->

そのため、限定された一致変数を使用して、何にでも一致させることができます。正規表現を正しく使用するには、どの方法を使用する必要がありますか? それらの有無に[]かかわらず?どちらも正しい出力を提供します。

4

4 に答える 4

5

ドット ( .) は、文字クラス内の「何か」を意味するものではありません。何にでも一致する文字クラスが必要なのはなぜですか?

于 2012-02-03T17:48:15.190 に答える
3

のような文字クラスの省略形は\w、outとまったく同じ内部文字クラスを意味しますが、のようなメタ文字は\d通常、文字クラス内で特別な意味を失います。そのため、期待どおりに機能しませんでした。リテラルに一致します。\s./<!--[.]*-->/[.].

しかし、改行と一致しない/<!--.*-->/ため、実際には機能しません。.ほとんどの正規表現フレーバーでは、単一行モードを使用して、次のように改行を含む/<!--.*-->/sすべての文字にドットを一致させます。またはこれ:(?s)<!--.*-->。ただし、JavaScriptはその機能をサポートしていないため、ほとんどの人は[\s\S]代わりに「空白文字または空白以外の文字」 つまり任意の文字を使用します。

しかし、それも正しくありません。(ジェイソンがコメントで指摘したように)最初<!--から最後まですべてに貪欲に一致し-->、いくつかの個別のコメントとそれらの間のすべての非コメント資料を含む可能性があるためです。それを本当に正しくすることはおそらく努力する価値がありません。正規表現を使用してHTMLと一致させる場合、とにかく多くの単純化された仮定を行う必要があります。ある程度の整形式性を想定できない場合は、あきらめた方がよいでしょう。この場合、数量詞を欲張りでないものにするだけで十分です。

var regex5 = /<!--[\s\S]*?-->/g;
于 2012-02-03T22:08:27.820 に答える
3

正規表現<!--[.]*--><!--.*-->同じ意味

これは正しくありません。

括弧[]は文字クラスを示し、クラス内の任意の文字が一致する可能性があります。[.]' ' 文字を含む文字クラス.です。これを.、 「任意の文字」を意味する定義済みの文字クラスである と比較してください (行末記号を除く)。

したがって、一致する<!--[.]*-->のは、空のコメントまたは完全に「.」文字で構成されるコメントのいずれかです。一致する<!--.*-->のは、空のコメントか、改行以外の任意の文字で満たされたコメントです。

于 2012-02-03T18:22:08.087 に答える
2

最初のものは同じ意味ではないため、そうではありません。1 つ目は、ピリオド文字に一致することを意味します。ピリオド文字は、[] セット内に配置された場合、一般的な一致ではありません。(考えてみれば、これは理にかなっています。なぜ、限定された一致変数のセット内の何かに一致させたいのでしょうか)

于 2012-02-03T17:49:30.707 に答える