我正在使用PHP。我需要验证以下类型的字符串:
B223213FCF@COM
B90TY13AAA@DE
232342342X@CO.UK
哪些模式是:
- "B"后跟 2 位数字和 7 个字母数字值
- 9 位数字和第十个字符,可以是"X"或其他数字
@
后,接受以下域名后缀:
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.
因为上面的字符串(末尾带有点)仍然有效。我想域名后缀必须被视为确切的词。
您可以将
两个正则表达式合并为
^(?:B'd{2}'w{7}|'d{9}X)@(?:co'.(?:uk|jp)|com(?:'.(?:au|mx))?|c[an]|de|es|fr|i[nt]|nl)$
查看正则表达式演示
我引入了锚点^
和$
以确保模式应用于整个字符串,在@
之前添加了两个替代方案((?: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)
- 顶级域名替代品列表 -
$
- 字符串结尾
注意
如果第一部分到@
必须区分大小写,而第二部分不应区分大小写,请省略正则表达式声明末尾的通用 /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)$~'
查看另一个正则表达式演示