简单有效的正则表达式不匹配

时间:2013-05-07 04:51:23

标签: javascript regex

这有什么不对吗?

var attrRegex = /^.*[[].*[]]$/;
var attrKeys = key.match(attrRegex);

这应匹配some-var[data-key]

1 个答案:

答案 0 :(得分:4)

要指定[],您应该将其\[\]转义。

/^.*\[.*\]$/

但是,您当前的正则表达式只会检查[后跟],而]位于字符串末尾。它不会验证正好有1个左括号[和1个近括号],或者括号[]是否平衡。

如果您想确保只有一对括号,并且不允许.禁止的换行符:

/^[^\[\]\n\r\u2028\u2029]*\[[^\[\]\n\r\u2028\u2029]*\]$/

分解:

^
[^\[\]\n\r\u2028\u2029]*   # Exclude [, ], and newline characters
                           # \n\r\u2028\u2029 are originally excluded by .
\[                         # Literal [
[^\[\]\n\r\u2028\u2029]*
\]                         # Literal ]
$

您的原始正则表达式/^.*[[].*[]]$/是如何解释的?

在Firefox上,根据我的测试,正则表达式被解释为:

^    # Nothing interesting
.*   # ...
[[]  # Character class containing [
.*   # ...
[]   # Empty character class!!! NOTHING can be matched
]    # Literal ]
$    # ...

不确定其他浏览器,但在编写正则表达式时,请正确转义以避免意外行为。

根据语言的不同,]或两者[]在字符类[]中具有特殊含义,必须进行转义。