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