合并两个正则表达式并匹配字符串,但不与句点(或点或句号)匹配


Merge two regex and match strings but not with period (or dot or full stop)

我正在使用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)$~'

查看另一个正则表达式演示