如何检查一个字符串是否完全匹配一个正则表达式模式?

5
我正在为客户的产品销售网站编写注册脚本。
我目前正在处理参考 ID 输入区域,并希望确保参考 ID 在付款方式的正确参数范围内。
参考 ID 将类似于此:XXXXX-XXXXX-XXXXX。
我尝试使用此正则表达式模式进行匹配:/(\w+){5}-(\w+){5}-(\w+){5}/。
这完美地匹配了它,但它也匹配了 XXXXX-XXXXX-XXXXXXXXXX。
或者至少在其中找到了一个匹配。我希望它能确保整个字符串匹配。我对正则表达式不太熟悉。
我该如何做?

2
“(\w+){5}” 不是表示 5 或更多吗?用 “\w{5}” 不是可以正确匹配吗? - Emyr
@Emyr - 是的,几乎没有其他人注意到这一点。 - Alnitak
啊,谢谢,Emyr。这就是为什么它们没有起作用的原因! - Rob
现在我希望我当时把那个作为答案发出来了! - Emyr
9个回答

9

您需要使用起始和结束锚点。或者,如果您不需要捕获这些组,则可以省略括号。

另外,+{5} 表示匹配超过一次,正好 5 次。我相信您不想要那样,所以我去掉了 +

/^\w{5}-\w{5}-\w{5}\z/

此外,我使用了\z,这样你的字符串就不会匹配"abcde-12345-edcba\n"

@Rob 祝你愉快!如果想了解更多关于正则表达式的知识,http://www.regular-expressions.info/ 是一个很棒的网站。 - alex
@ridgerunner 这里有另一个例子没有多行模式。你可以看到$\n处匹配,而不是仅在字符串末尾匹配。此外,"如果字符串以换行符结尾,[$]也会在最后一个换行符之前匹配。"来源 - alex
1
@alex:先生,你是正确的!使用PCRE,在关闭多行模式时,“$”确实会匹配字符串末尾的换行符之前(尽管它不会在任何其他换行符之前匹配)。我肯定要好好"上课"了。非常感谢你!+1 - ridgerunner
ideone的链接指向一个空白页面 - 代码还有其他地方可以获取吗? - Anderson Green
1
@AndersonGreen 我不知道那个链接发生了什么事。正则表达式在答案中,所以只需将其放入相应的 preg_*() 函数中即可。 - alex
显示剩余4条评论

9
使用^$来分别匹配输入字符串的开头和结尾。
此外,请注意您使用+是多余的,因为(\w+){5}意味着“一个单词字符,至少出现一次,重复五次”,这意味着它至少可以匹配五次。 您可能想要使用(\w){5}(如果您不需要反向引用,则只需使用\w{5};在我的示例中,我将假设您需要反向引用)。
/^(\w){5}-(\w){5}-(\w){5}$/

你也可以使用\A\Z代替^$ - Bob Fincheimer
@Bob:没错,它们的微小差别在于它们永远不会匹配到换行符。在某些情况下可能是有益的,但我认为在这里不会有影响。 - Lightness Races in Orbit
@Alnitak:啊,该死!我已经修复了,现在我能拿回我的分数吗? 虽然我不会期望得到赞成票,但是打负分有点过分了。 - Lightness Races in Orbit

2
把正则表达式放在^$之间,以匹配整个字符串,并检查它是否与任何内容匹配。
例子:
/^(\w+){5}-(\w+){5}-(\w+){5}$/

1

尝试

/^([\w]{5,5})-([\w]{5,5})-([\w]{5,5})$/i

有几个在线正则表达式测试工具,我在编码之前使用这个


+1 修复了 (\w+){5},尽管这太啰嗦了! - Alnitak

0

1
你需要将定界符放在表达式的 外部 。它们是用来 定界 表达式的。你已经将锚定点放在了定界符的外面。 - Lightness Races in Orbit

0
你需要使用^匹配字符串的开头,使用$匹配字符串的结尾:
/^\w{5}-\w{5}-\w{5}$/

请注意,(\w+){5} 是不正确的,因为这意味着重复五次 \w+,而这又意味着“一个或多个单词字符”。

1
不要太过于阴谋论。没有人会“战术性地给你点踩”。 - Lightness Races in Orbit
有人在完全正确的情况下对此进行了负评。也许这只是一个报复性的投票? - Alnitak

0

将其用"^"和"$"括起来,如下:

/^(\w+){5}-(\w+){5}-(\w+){5}$/

0

/^(\w){5}-(\w){5}-(\w){5}$/
你需要明确地说明你想要的模式从字符串的开头开始,一直到结尾结束。
你可以改进它:/^((\w){5}-){2}(\w){5}$/;这样,你可以轻松修改序列号可能具有的元素数量。


-1
在 preg 中,\b 标记单词边界。因此,您可以尝试使用类似以下的内容。
/\b(\w+){5}-(\w+){5}-(\w+){5}\b/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接