2016-05-31 21 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

是的,仍然和我的正则表达式一样。 :) –

相关问题