2016-02-23 61 views
1

我正在使用PHP。我需要驗證以下種類的字符串:合併兩個正則表達式和匹配字符串,但不包含句點(或點或句號)

[email protected] 
[email protected] 
[email protected] 

哪個模式是:

  • 「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 

我現在面臨的問題是:

  • 我不知道如何合併兩個正則表達式在一個單一的一個
  • 第二正則表達式需要固定到匹配點作爲在這種情況下:

    [email protected] 
    

因爲上面的字符串(結尾處的點)仍然有效。域擴展必須被認爲是我想的確切詞。

+1

使用錨? '/^pattern1 @ pattern2 $/i' –

回答

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

+1

你的解釋非常有用! – Nicero

相關問題