JavaScript正则表达式中多个正向前瞻的语法

时间:2014-09-30 20:15:37

标签: regex regex-lookarounds

我试图在一个正则表达式中包含两个正向前瞻。以下是我正在处理的问题。

(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20}

这就是我想要匹配的内容:

  • 0-20个字符
  • 任何地方的一封或多封信件
  • 任何地方的一个或多个号码
  • 只允许使用字母和数字

当我只使用一个前瞻时,它可以工作,但是一旦我添加另一个,它就会中断。两个前瞻的正确语法是什么?

2 个答案:

答案 0 :(得分:9)

Lookaheads 就像徘徊!你限制了第一个不符合要求的外观领域。您可以使用贪婪的点.*(或惰性.*?)正则表达式来允许前瞻查找每个要求。

正如@AlexR在评论中提到的,我稍微修改了RegEx:

^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9_]{0,20}$

顺便说一下,你忘记了我添加的匹配下划线。

以上几乎等于:

^(?=[^a-zA-Z]*[a-zA-Z])(?=\D*\d)\w{1,20}$

答案 1 :(得分:1)

当输入太长时,会出现@revos回答的问题:01234567890123456789A传递前瞻和最终检查。固定版本要么使用^$检查字符串结尾,要么使用可变长度的外观(或两者):

^(?=.{0,19}[a-zA-Z])(?=.{0,19}[0-9])[a-zA-Z0-9]{0,20}$ // (1), (1*) without ^
^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{0,20}$
(?=.{0,19}[a-zA-Z])(?=.{0,19}[0-9])[a-zA-Z0-9]{0,20} // (2)

只有后者才允许指定字符串周围的文本。省略前一种变体中的^将允许密码加前缀,即

Input            : "Password1 = ASDF0123"
Matches with (1) : none
Matches with (1*): "ASDF0123"
Matches with (2) : "Password1", "ASDF0123"