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

时间:2016-02-23 16:22:38

标签: php regex

我正在使用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.
    

因为上面的字符串(末尾带点)仍然有效。域扩展必须被视为我想的确切词。

1 个答案:

答案 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)$~'

请参阅another regex demo