0

Object RegExp のテスト関数に関する私のコードが正規表現パターンと同じように機能しないのはなぜですか。何か不足していますか、それとも間違ったエスケープ正規表現を使用していますか

<html>
<body>

<script type="text/javascript">

var str = "info@test.com";

//This isn't working
var regStr = "^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$"; //This string can be any regex get from XSLT

//Escape function get from: http://stackoverflow.com/a/6969486/193850
regStr = regStr.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
console.log(regStr); // \^\(\[w\-\]\+\(\?:\.\[w\-\]\+\)\*\)@\(\(\?:\[w\-\]\+\.\)\*w\[w\-\]\{0,66\}\)\.\(\[a\-z\]\{2,6\}\(\?:\.\[a\-z\]\{2\}\)\?\)\$
var re = new RegExp(regStr , "i");
console.log(re.test(str)); //false


var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
console.log(filter.test(str)); //true

</script>

</body>
</html>
4

2 に答える 2

3

正規表現を文字列として記述するときは、バックスラッシュを 2 つにする必要があります。

なんで?文字列リテラルの構文は、引用文字、改行などについて、独自のバックスラッシュ引用規則も遵守します。したがって、JavaScript が正規表現を含む文字列定数を解析すると、バックスラッシュは消えます。したがって、文字列を RegExp コンストラクターに渡すときに、実際に意図した正規表現が表示されるように、それらを別のバックスラッシュで引用する必要があります。

于 2012-07-03T13:40:20.537 に答える
2

ほら、混乱している。使用した関数は、文字列になる正規表現を前処理するための優れた方法であるため、正規表現のメタ文字 (文字通りだけでなく、正規表現の動作を制御するシンボル) のエスケープについて心配する必要はありません。

\wしかし、ポイントは、このエスケープ関数によって取得される前に、文字\.既に解析されているということです。w.

表 2.1 にリストされていない文字については、前のバックスラッシュは無視されますが、この使用法は非推奨であり、避ける必要があります。

実際、エスケープ関数は の前のスラッシュを復元しました.w、特別なものではありませんでした。) したがって、RegExp コンストラクターに入った文字列は、[w]代わりに[\w].

確認するのは実際には非常に簡単です。交換操作のconsole.log(regStr) 直後です。

于 2012-07-03T13:49:04.453 に答える