为什么正则表达式/[[u-%]/会破坏JavaScript?

为什么正则表达式/[[u-%]/会破坏JavaScript?,javascript,regex,Javascript,Regex,以下JavaScript不输出任何内容(甚至不输出“false”),并且确实会阻止页面上的任何其他JavaScript运行: var pattern = new RegExp(/[_-%]/); document.write(pattern.test("foo")); 这个正则表达式的作用是什么?如果删除三个字符中的任何一个(u,-或%),则一切正常。如果三个字符的顺序发生了变化,那么一切都正常。这是因为解释器认为它处理的是一个范围。就像/[a-z]/将匹配a和z之间的任何字符一样,/[\-%

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

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

这个正则表达式的作用是什么?如果删除三个字符中的任何一个(u,-或%),则一切正常。如果三个字符的顺序发生了变化,那么一切都正常。

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

< P>这是中间的短线。JavaScript将
[\-%]
视为字符类范围,类似于
[a-Z]
。我猜你使用的浏览器不能很好地处理这种情况。我建议将连字符移到前面,或者用反斜杠(
\-
)将其转义。

[]块中的连字符用于范围。因此uu%无效。 你可以逃避它:

var pattern = new RegExp(/[_\-%]/);
或者移到开头:

var pattern = new RegExp(/[-_%]/);
或到最后:

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

因为正则表达式知道开头的连字符(或结尾的连字符,谢谢BrunoLM!)表示文字连字符而不是范围。

请使用以下内容:

/[-_%]/

-将被解释为一个范围。您还可以使用\-

也可以通过用\-转义-来避免范围语义。有趣的是,如果您交换
%
\
,它会工作,但可能不像您预期的那样(
%
是ASCII 45,
\
是ASCII 137)。