Regex Preg_match用于许可证密钥25个字母数字和4个连字符



我仍在努力掌握regex模式,只是在仔细检查了一下是否有人愿意帮忙!

我有一个字符串,应该包含:

  • 10位(数字和字母)许可证密钥,例如:1234567890 OR
  • 25位(数字和字母)的许可证密钥,例如:ABCD1EFGH2IJKL3MNOP4QRST5OR
  • 29位的许可证号码(25个数字和字母,用连字符分隔成5组),例如:ABCD1-EFGH2-IJKL3-MNOP4-QRST51

我可以使用ctype_alnum和strlen函数来匹配前两个fine。然而,对于最后一个,我认为我需要使用regex和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个字符吗?我不确定是否有一种更简单的方式来用regex表达这一点?

谢谢你抽出时间!

要点是需要同时使用^(字符串的开始)和$(字符串的结束)锚点。此外,当在(...)之后使用+时,允许在(...)内对整个子模式进行1次或多次重复。因此,您需要删除+并添加$锚点。此外,您需要正则表达式的分隔符才能在PHPpreg_match中工作。我更喜欢~,以免逃离/。也许这里不是这样,但这是一种习惯。

因此,正则表达式可以看起来像

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

查看regex演示

CCD_ 14匹配CCD_ 15子模式的4次出现。(?:...)是一个非捕获组,其匹配的文本不存储在任何缓冲区中(与捕获组不同)。

查看IDEONE演示:

$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!";
}

怎么样:

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

相关内容