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

问题描述 投票:5回答:2

我试图在一个正则表达式中包含两个正向前瞻。这是我正在努力解决的问题。

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

这就是我想要匹配的:

  • 0-20个字符
  • 一个或多个字母
  • 一个或多个数字
  • 只允许字母和数字

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

regex regex-lookarounds
2个回答
9
投票

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

正如评论中提到的@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
投票

当输入太长时,会出现@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"
© www.soinside.com 2019 - 2024. All rights reserved.