我正在尝试验证一个由3个数字后跟/然后5个数字组成的字符串,我认为这会起作用
(/^([0-9]+[0-9]+[0-9]+/[0-9]+[0-9]+[0-9]+[0-9]+[0-9])/i)但它不是,你知道我做错了什么吗?
发布于 2011-09-05 09:16:43
首先,您使用/作为正则表达式分隔符,因此不能在不使用反斜杠进行转义的情况下在模式中使用它。否则,PHP会认为您的模式在中间的/处结束(您可以看到StackOverflow的语法突出显示也是这样认为的)。
其次,+是“贪婪的”,它将匹配尽可能多的字符,因此第一个[0-9]+将一次性匹配前3个数字,而不会留下下两个要匹配的数字。
第三,没有必要使用i,因为您要处理的数字既不是大写也不是小写,所以区分大小写是一个没有意义的问题。
试试这个吧
/^\d{3}\/\d{5}$/\d是编写[0-9]的缩写,{3}和{5}分别表示重复3次或5次。
(此图案锚定到字符串的开头和结尾。您的模式仅锚定到开头,如果这是故意的,请从我的模式中删除$ )
发布于 2011-09-05 09:15:58
尝尝这个
preg_match('@^\d{3}/\d{5}@', $string)您的代码不起作用的原因是+符号与指定字符或字符类的“一个或多个”匹配。
此外,在使用正斜杠分隔符(表达式的开头和结尾处的字符)时,需要在模式中的任何正斜杠前加上反斜杠进行转义,例如
/foo\/bar/PHP允许您使用备用分隔符(如我的答案所示),如果您的表达式包含许多正斜杠,这将非常方便。
发布于 2011-09-05 09:37:08
我最近发现这个站点对调试正则表达式很有用:http://www.regextester.com/index2.html
它假定使用了/.../ (这意味着您不应该在粘贴的正则表达式中包含这些斜杠)。
所以,在我把你的正则表达式^([0-9]+[0-9]+[0-9]+/[0-9]+[0-9]+[0-9]+[0-9]+[0-9])放在正则表达式框中,把123/45678放在测试框中后,我看不到匹配。当我在中间的正斜杠前面放一个反斜杠时,它就会识别匹配。然后,您可以尝试匹配1234/567890,并发现它仍然匹配。然后你通过并删除所有的加号,然后它正确地停止匹配。
我特别喜欢这个特定站点的一点是它以红色显示部分匹配的方式,允许您查看您的正则表达式正在运行的位置。
https://stackoverflow.com/questions/7303145
复制相似问题