我试图在一个正则表达式中包含两个正向前瞻。以下是我正在处理的问题。
(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20}
这就是我想要匹配的内容:
当我只使用一个前瞻时,它可以工作,但是一旦我添加另一个,它就会中断。两个前瞻的正确语法是什么?
答案 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"