我仍在努力掌握regex模式,只是在仔细检查了一下是否有人愿意帮忙!
我有一个字符串,应该包含:
- 10位(数字和字母)许可证密钥,例如:1234567890 OR
- 25位(数字和字母)的许可证密钥,例如:
ABCD1EFGH2IJKL3MNOP4QRST5
OR - 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