我试图在一个正则表达式中包含两个正向前瞻。这是我正在努力解决的问题。
(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20}
这就是我想要匹配的:
当我只使用一个前瞻时,它可以工作,但是一旦我添加另一个,它就会中断。两个前瞻的正确语法是什么?
前瞻就像徘徊!你限制了第一个不符合要求的外观领域。您可以使用贪婪的点.*
(或懒惰的.*?
)正则表达式来允许前瞻查找每个要求。
正如评论中提到的@AlexR我稍微修改了RegEx:
^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9_]{0,20}$
顺便说一句,你忘记了匹配的下划线,我补充说。
以上几乎等于:
^(?=[^a-zA-Z]*[a-zA-Z])(?=\D*\d)\w{1,20}$
当输入太长时,会出现@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"