2012-01-31 10 views
0

私はJavascriptの正規表現のをいじり、これを発見した今日:Javascriptの正規表現疑問符クロスブラウザの動作

//Suppose 
var one = 'HELLOxBYE'; 
var two = 'HELLOBYE'; 

あなたはこれらの方法の両方に「X」を捕獲しようとする正規表現を作成することができます。

/^HELLO(x?)BYE$/ //(A) 

//or 

/^HELLO(x)?BYE$/ //(B) 

私はvar(A)をvar 2で使用すると、regexpは空の文字列 ''を返します。一方、(B)を使うと、正規表現はnullを返します。

あなたはそれに注意する必要があります。

これがブラウザ間の動作であるかどうかは誰にもわかりますか?

私はGoogle Chromeの(Webkitの)15

UPDATEを構築する上でこれをテストしてみた:おっ、ただのInternet Explorer 8でいくつかのテストをした、そしてそれは両方のケースのために空の文字列「」を返します。だから私の結論は、(A)を使って空の文字列をテストするのが最善の選択肢だということです。 ?内部キャプチャグループであるため、捕捉ブラケットは、「X」と空の文字列の両方を取り込むことができるので

+0

あなたは別の正規表現を使用していて、別の結果を返していますが、どのようにクロスブラウザーの動作ですか?異なる結果を持つ同じ正規表現がある場合は、それです。 – xdazz

+0

試合のテストに使用しているコードを表示できますか? (さらに良いのは、http://jsfiddle.netで設定します)@xdazz - ブラウザによって、結果が異なります。私は当初、これが期待される結果であるという答えを投稿しましたが、IEで試したときにnullの代わりに空の文字列が得られました。 – nnnnnn

+0

@nnnnnnはい、それは私が言ったように、同じ正規表現別の結果は、それはクロスブラウザの動作です。 – xdazz

答えて

2

技術(A)はHELLOBYE''を返すべきです。

(B)では、キャプチャ括弧は、の文字列xをキャプチャできます。 xが存在しない場合、グループは、グループ内の正規表現とは対照的に、グループ全体は、オプションであるので、全てで捕捉されることはありません。

微妙な違い!

いつもは返されますが、(B)が返すものは明確に定義されているわけではないため、実装によって異なる場合があります。グループは空の文字列に一致しました "と"グループはまったく一致しませんでした "。 IEはこの区別をしませんが(そうであれば、2番目のケースの戻り値の型を空の文字列に強制します)。

要約 - を知っているのでがなければ、xがなければ、キャプチャグループは確実に ''と一致します。 (B)を使用することは、ブラウザが「長さゼロの一致」と「全く一致しない」のどちらを区別するかによって異なります。

+0

まさに私が頑張ったので、これはブラウザ間の振る舞いではないと結論づけることができます。 – almosnow

+1

まあ、(B)種類です。 –