2016-05-31 26 views
2

我仍然試圖去掌握正則表達式模式,並在稍後再仔細檢查一下,如果有人不介意妥協!許可證密鑰的正則表達式匹配25個字母數字和4個連字符

我有一個字符串,其都應包含:

  • 10位(數字和字母)許可密鑰,例如:1234567890 OR
  • 一個25位(數字和字母)的許可證密鑰,用於例如:ABCD1EFGH2IJKL3MNOP4QRST5 OR
  • A 29位許可證號碼(25數字和字母,用連字符分離成5組),例如:ABCD1-EFGH2-IJKL3-MNOP4-QRST51

我可以匹配前兩個罰款,使用ctype_alnum和strlen函數。然而,對於最後一個我認爲我需要使用正則表達式和preg_match

我在regex101.com一個走了過來,並與下面上來:

preg_match('^([A-Za-z0-9]{5})+-+([A-Za-z0-9]{5})+-+([A-Za-z0-9]{5})+-([A-Za-z0-9]{5})+-+([A-Za-z0-9]{5})', $str); 

這似乎符合我要找的。 我希望字符串只包含以許可證號開頭的字符串的完全匹配,並且不包含任何順序的混合大小寫字母和數字以及每組5個字符之間的連字符(因此總共有29個字符 - 我不想進一步匹配)。在29位數字鍵之前或之後沒有空格,沒有其他字符,也沒有其他字符。

請問以上的工作,不允許任何其他組合?它會停止檢查29個字符?我不確定是否有更簡單的方法來表達這個正則表達式?

謝謝你的時間!

+1

你忘了錨和正則表達式的分隔符。另外,我相信'+'放錯了位置,將它們刪除。使用''[A-Za-z0-9] {5} - [A-Za-z0-9] {5} - [A-Za-z0-9] {5} - [A-Za-z0 -9] {5} - [A-ZA-Z0-9] {5} $〜''。或者甚至是''^^[A-Za-z0-9] {5}(?: - [A-Za-z0-9] {5}){4} $〜''。試試[這裏](https://regex101.com/r/jC3xV2/3)。 –

+0

@WiktorStribiżew感謝您的快速響應,非常感謝。你能解釋縮短版本的含義嗎?我試圖更好地理解正則表達式。因此,我不必在這裏困擾你們!此外,如果您將此作爲答案提交,我將能夠接受它是否有效(當我接受答案的時間限制通過時)。 – BottyZ

+0

*如果有效*是我不發佈該信息的關鍵。它工作嗎?縮短的版本與更長的版本相同,它只是使用限制量詞'{4}',以免重複該模式4次。請注意,'$'匹配字符串的末尾。 –

回答

2

主要的一點是,你需要同時使用^(字符串的開始)和$錨(字符串的結束)。另外,當您在(...)之後使用+時,允許(...)內的整個子模式重複1次或多次。因此,您需要刪除+並添加$錨點。此外,您需要使用正則表達式分隔符來讓您的正則表達式在PHP preg_match中工作。我更喜歡~以免逃脫/。也許情況並非如此,但這是一種習慣。

所以,正則表達式可以像

'~^[A-Za-z0-9]{5}(?:-[A-Za-z0-9]{5}){4}$~' 

regex demo

(?:-[A-Za-z0-9]{5}){4}比賽出現4次-[A-Za-z0-9]{5}子模式。 (?:...)是一個非捕獲組,其匹配文本不會存儲在任何緩衝區中(與捕獲組不同)。

IDEONE demo

$re = '~^[A-Za-z0-9]{5}(?:-[A-Za-z0-9]{5}){4}$~'; 
$str = "ABCD1-EFGH2-IJKL3-MNOP4-QRST5"; 
if (preg_match($re, $str, $matches)) { 
    echo "Matched!"; 
} 
+1

感謝您的詳細解釋。 – BottyZ

1

如何:

preg_match('/^([a-z0-9]{5})(?:-(?1)){4}$/i', $str); 

說明:

/    : regex delimiter 
^   : begining of string 
    (   : begin group 1 
    [a-z0-9]{5} : exactly 5 alphanum. 
)    : end of group 1 
    (?:   : begin NON capture group 
    -   : a dash 
    (?1)  : same as definition in group 1 (ie. [a-z0-9]{5}) 
){4}   : this group must be repeated 4 times 
    $    : end of string 
/i    : regex delimiter with case insensitive modifier 
+0

嗨託託,感謝您的回覆,我不確定上述是否正確,因爲它似乎不工作,當我通過我的窗體運行它。然而Wiktor在上面評論中的版本確實如此。 – BottyZ

+0

@BottyZ:我忘記了'/ i'修飾符,現在它應該可以工作。 – Toto

+0

是的,仍然和我的正則表達式一樣。 :) –

相關問題