PHP正则表达式与Windows产品密钥匹配

PHP正则表达式与Windows产品密钥匹配,php,regex,Php,Regex,我正在尝试(但失败)编写一个PHP正则表达式,该正则表达式将匹配形式为XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX(其中X是大写字母或数字)的Windows产品密钥 我提出了以下建议,但它并没有达到我的预期(前提是它确实能够达到我的预期!)。我认为自己精通PHP,但是正则表达式对我来说是一个特别的弱点。 ([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5}) 我真正想要的是通过ABCD

我正在尝试(但失败)编写一个PHP正则表达式,该正则表达式将匹配形式为XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX(其中X是大写字母或数字)的Windows产品密钥

我提出了以下建议,但它并没有达到我的预期(前提是它确实能够达到我的预期!)。我认为自己精通PHP,但是正则表达式对我来说是一个特别的弱点。
([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})
我真正想要的是通过
ABCDE-FGHIJ-KLMNO-PQRST-UVWXY
,但失败
ABCDE-FGHIJ-KLMNO-PQRST-UVWXYZ
(注意最后一个块有6个字符)


额外聊天:是的,我知道Windows产品密钥中并非所有字母都有效,但重要的一点是它验证文本是否以正确的格式输入。

您缺少的只是在正则表达式中定位锚。目前,正则表达式将在字符串中的任何位置匹配该模式。字符串可以由“我的产品密钥是XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX,我的名字是Bob”和您的正则表达式匹配。你需要的是

^([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})$

^
只匹配字符串的开头,而
$
只匹配字符串的结尾。

我目前还不是正则表达式专家,但我觉得你所拥有的一切都很好。您是否尝试过在前面添加一个
^
,在后面添加一个
$
?您使用什么函数应用正则表达式?什么不起作用?为什么你对正确的格式如此着迷?一个好的设置例程(我相信Windows使用的例程也会这样做)会自动在其中添加破折号,并忽略空格和大写。@Johannes Rössel-这是一个正在工作的系统,它以多种不同的格式管理许多许可证密钥。我们最近遇到过几个例子,其中密钥被错误地输入到系统中(例如,6个X块而不是5个),而小写键在大量大写键中看起来很难看。应用不同的正则表达式,这取决于许可证的软件名称。您可以将其缩短为
^[A-Z1-9]{5}([A-Z1-9]{5}){4}$
;在我看来更像是验证。但是,是的,如果你需要这些小组,那么它就不会以简写的形式起作用。啊,这就是它的全部@约翰内斯·罗塞尔——我也要试一试。谢谢你们两位。