为什么正则表达式/ [_-%] /打破JavaScript?

时间:2011-05-14 02:58:49

标签: javascript regex

以下JavaScript不输出任何内容(甚至不是“false”),并且确实阻止了页面上的任何其他JavaScript运行:

var pattern = new RegExp(/[_-%]/);
document.write(pattern.test("foo"));

这个正则表达式是做什么的?如果删除了三个字符(_, - 或%)中的任何一个,则一切正常。如果三个字符的顺序完全改变,一切正常。

4 个答案:

答案 0 :(得分:6)

[]块中的连字符用于范围。所以_ to%无效。 你可以逃脱它:

var pattern = new RegExp(/[_\-%]/);

或转到开头:

var pattern = new RegExp(/[-_%]/);

或结束:

var pattern = new RegExp(/[_%-]/);

由于正则表达式在开始时知道连字符(或者结束,感谢BrunoLM!)意味着字面连字符而不是范围。

答案 1 :(得分:1)

这是因为在翻译中认为它正在处理一个范围。就像/[a-z]/匹配az之间的任何字符一样,/[_-%]/会(尝试)匹配_%之间的任何字符。这没有意义,所以JavaScript停止了。将连字符作为第一个或最后一个字符将解决问题。

答案 2 :(得分:0)

这是中间的破折号。 JavaScript将[_-%]视为字符类范围,类似于[A-Z]。我猜你正在使用的浏览器根本不能很好地处理这种情况。我建议将连字符移到前面,或用反斜杠(\-)转义。

答案 3 :(得分:0)

请改用以下内容:

/[-_%]/

- 本来会被解释为范围。您也可以使用\ -