我有此正则表达式来检测电子邮件地址:
(?=.*[a-zA-Z])([a-zA-Z0-9_.+-]{8,})@(\S+\.\S+)
要求:@
之前的部分必须包含至少一个字母,并且长度至少为8个字符。
我正在使用正向先行查找是否包含字母,但先行实际上适用于整行(@
之后的部分通常将包含字母),因此可以通过
123456789@gmail.com
问题是,我如何仅验证第一个捕获组(在这种情况下为123456789
)的结果以查看是否有字母?
答案 0 :(得分:2)
stat
之前的<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>3.0.10.Final</version>
</dependency>
消费模式部分与[a-zA-Z0-9_.+-]{8,}
不匹配,因此前行检查应仅检查0个或多个字符后的字母,除了 @
。
使用
@
将解决此问题。参见the regex demo和Regulex graph:
您可以通过规定@
进一步优化超前模式。例如。由于您只允许(?=[^@]*[a-zA-Z])([a-zA-Z0-9_.+-]{8,})@(\S+\.\S+)
除字母外,您可以将正则表达式写为
[^@]
请参见this regex demo。
或者,您可以遵循principle of contrast(suggested in comments),并使用0-9_.+-
代替(?=[0-9_.+-]*[a-zA-Z])([a-zA-Z0-9_.+-]{8,})@(\S+\.\S+)
^^^^^^^^^
。
根据您使用正则表达式的位置,可能要用[^@a-zA-Z]*
和[^@]*
锚将其包装以确保完整的字符串匹配。