在Javascript中使用正则表达式的未终止的括号错误

时间:2010-09-23 11:00:03

标签: javascript regex

我正在尝试使用以下正则表达式来验证javascript中的日期(对不起,这有点粗野):

"/^(((0[1-9]|[12][0-9]|3[01])\/(0[13578]|1[02])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|[12][0-9]|30)\/(0[13456789]|1[012])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|1[0-9]|2[0-8])\/02\/((19|[2-9][0-9])[0-9]{2}))|(29\/02\/((1[6-9]|[2-9][0-9])(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/"

问题是,我收到了一个Unterminated Parenthetical Javascript错误。我尝试在PHP中使用preg_match这个表达式,它运行正常。

有点难过所以任何帮助都会非常感激!

编辑:我应该补充一点,我尝试验证的日期将采用dd / mm / yyyy格式。

编辑2:抱歉,我应该澄清我正在使用来自position-abolute.com(http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/)的jQuery验证器。
我定义的自定义规则是:

"date":{
    "regex":"/^(((0[1-9]|[12][0-9]|3[01])\/(0[13578]|1[02])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|[12][0-9]|30)\/(0[13456789]|1[012])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|1[0-9]|2[0-8])\/02\/((19|[2-9][0-9])[0-9]{2}))|(29\/02\/((1[6-9]|[2-9][0-9])(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/",
    "alertText":"* Invalid date, must be in DD/MM/YYYY format."}

4 个答案:

答案 0 :(得分:1)

Firebug中没有错误。另外 regexplanet.com 编译这个罚款(一旦删除正斜杠)。

然而,21个捕获组 - 特别是如果它们是嵌套的 - 在JavaScript中几乎不是理想的方法。解析比赛将是一场噩梦。

我的建议是尽可能将你的正则表达式分解成部分。

答案 1 :(得分:1)

感谢大家的回答。我知道使用这种混乱的正则表达式并不理想,但我正在研究现有系统,并希望保持一致的验证方法。

无论如何,正在发生的事情是正则表达式字符串在被评估之前被另一个方法提取,这删除了转义的'\'字符('/'变为'/')。

我能想到的最快的解决方案是将'/'替换为'[/]',因为正斜杠在字符集中失去了它的特殊含义。正则表达式现在看起来像:

/^(((0[1-9]|[12][0-9]|3[01])[/](0[13578]|1[02])[/]((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|[12][0-9]|30)[/](0[13456789]|1[012])[/]((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|1[0-9]|2[0-8])[/]02[/]((19|[2-9][0-9])[0-9]{2}))|(29[/]02[/]((1[6-9]|[2-9][0-9])(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/

希望有意义并再次感谢!

答案 2 :(得分:0)

使用/ MyRegex /或新的RegExp(“myRegex”)

答案 3 :(得分:0)

正则表达式看起来很好,但我建议你使用非捕获组(?:)来不需要捕获任何东西。此外,如果您可能不知道,可以查看http://www.regular-expressions.info/以获取更多信息。