我正在使用PHP。我需要验证以下类型的字符串:
B223213FCF@COM
B90TY13AAA@DE
232342342X@CO.UK
哪种模式是:
在@
接受以下域名扩展后:
com.au, ca, cn, com, de, es, fr, in, it, co.jp, com.mx, nl, co.uk
我设法制定了以下两种正则表达式,它们以某种方式工作:
/B[0-9]{2}[0-9A-Z]{7}|[0-9]{9}(X|0-9])
@(com\.au|ca|cn|com|de|es|fr|in|it|co\.jp|com\.mx|nl|co\.uk)/i
我面临的问题是:
第二个正则表达式需要修复为不匹配点,如下例所示:
B223213FCF@COM.
因为上面的字符串(末尾带点)仍然有效。域扩展必须被视为我想的确切词。
答案 0 :(得分:2)
您可以将两个正则表达式合并为
^(?:B\d{2}\w{7}|\d{9}X)@(?:co\.(?:uk|jp)|com(?:\.(?:au|mx))?|c[an]|de|es|fr|i[nt]|nl)$
请参阅regex demo
我介绍了锚点^
和$
以确保模式应用于整个字符串,在@
之前添加了两个备选项(?:B\d{2}\w{7}
和\d{9}X)
),缩小TLD以提高正则表达式的效率(因为这样就需要更少的回溯步骤)。
正则表达式匹配:
^
- 字符串开头(?:B\d{2}\w{7}|\d{9}X)
- 两种选择:
B\d{2}\w{7}
- B
后跟2位数后跟2个字符|
- 或...... \d{9}X
- 九位数后跟X
@
- 文字@
符号(?:co\.(?:uk|jp)|com(?:\.(?:au|mx))?|c[an]|de|es|fr|i[nt]|nl)
- TLD备选方案列表$
- 字符串结尾注意强>
如果@
之前的第一部分必须区分大小写而第二部分不应区分,请在正则表达式声明的末尾省略常规/i
修饰符并使用(?i:...)
语法强制第二部分不区分大小写:
'~^(?:B\d{2}\w{7}|\d{9}X)@(?i:co\.(?:uk|jp)|com(?:\.(?:au|mx))?|c[an]|de|es|fr|i[nt]|nl)$~'