Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查字符串是否与正则表达式模式完全匹配?_Php_Regex - Fatal编程技术网

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

Php 如何检查字符串是否与正则表达式模式完全匹配?,php,regex,Php,Regex,我正在为我客户的产品销售网站编写注册脚本 我目前正在处理一个参考ID输入区域,我想确保参考ID在付款方法的正确参数范围内 参考ID将如下所示:XXXXX-XXXXX-XXXXX 我正在尝试使用这个正则表达式模式来匹配它:/(\w+){5}-(\w+){5}-(\w+){5}/ 这与它完全匹配,但它也匹配XXXXX-XXXXX-xxxxxxxxx 或者至少它在里面找到了匹配的。我希望它确保整个字符串匹配。我对正则表达式不太熟悉 我该怎么做呢?试试看 /^([\w]{5,5})-([\w]{5,5}

我正在为我客户的产品销售网站编写注册脚本

我目前正在处理一个参考ID输入区域,我想确保参考ID在付款方法的正确参数范围内

参考ID将如下所示:
XXXXX-XXXXX-XXXXX

我正在尝试使用这个正则表达式模式来匹配它:
/(\w+){5}-(\w+){5}-(\w+){5}/

这与它完全匹配,但它也匹配
XXXXX-XXXXX-xxxxxxxxx

或者至少它在里面找到了匹配的。我希望它确保整个字符串匹配。我对正则表达式不太熟悉

我该怎么做呢?

试试看

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

有几个在线正则表达式测试器,我在编写代码之前使用它们。

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

另外,
+{5}
意味着匹配不止一次,正好匹配5次。我相信你不想那样,所以我放弃了
+

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

另外,我使用了
\z
,因此您的字符串与
“abcde-12345-edcba\n”

使用^and$标记正则表达式字符串的开始和结束:

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

分别用于匹配输入字符串的开头和结尾

还请注意,使用
+
是多余的,因为
(\w+{5}
表示“一个单词字符,至少一次,乘以五次”,这意味着它至少可以匹配五次。您可能是指
(\w){5}
(或者如果您不需要反向引用,则仅指
\w{5}
;在我的示例中,我假设您需要反向引用)


将正则表达式放在
^
$
之间,以匹配整个字符串,并检查它是否匹配任何内容

例如:

/^(\w+){5}-(\w+){5}-(\w+){5}$/
将其括在“^”和“$”中,因此:


在preg中,\b标记单词边界。所以你可以试试这样的东西

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

您需要明确表示希望模式从字符串的开头开始,并在其结尾结束。

您可以改进它:
/^((\w){5}-{2}(\w){5}$/
;通过这种方式,您可以轻松修改序列号可能包含的元素数。

您需要
^
匹配字符串的开头,而
$
匹配字符串的结尾:

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

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

-1您需要将分隔符放在表达式的外部。他们限定了表达方式。您已将锚定放置在分隔符之外。您还可以使用
\A
\Z
而不是
^
$
@Bob:True,它们也有细微的不同,因为它们在换行时从不匹配。在某些情况下,这可能是可取的,但我看不出这会有什么不同。@Alnitak:啊,该死!既然我修正了,我能收回我的观点吗?向下投票有点多,但我不希望出现向上投票。@Sjoerd,以防字符串以换行符结尾。PHP警告:preg_match():编译失败:在第行的/root/regex.PHP中的偏移量6处没有要重复的内容3@Rob享受吧!如果你想了解更多关于正则表达式的知识,请不要忘记,这是一个很棒的网站。@alex:你说得对,先生!使用PCRE时,
$
确实会在多行模式关闭的字符串末尾的换行符之前匹配(尽管它不会在任何其他换行符之前匹配)。这次我肯定要去上学。多谢各位+1@AndersonGreen我不知道那个链接怎么了。正则表达式在答案中,因此只需将其放入
preg_*()
适当的函数中即可。另外,请查看中的工具列表(\w+{5})是否实际上意味着5个或更多?难道不匹配吗?@Emyr-是的,几乎没有人发现。啊,谢谢,Emyr。这就是为什么这些不起作用!但愿我现在就把它作为答案贴出来+1用于修复(\w+{5}),尽管这太冗长了!别这么阴谋论。没有人在战术上否决你。有人否决了这一点,尽管这是完全正确的。也许这只是一次报复性的投票?
/\b(\w+){5}-(\w+){5}-(\w+){5}\b/
/^\w{5}-\w{5}-\w{5}$/