我花了好几个小时搞清楚如何在PHP中编写正则表达式,我只需要允许以下格式的字符串传递:
(any digit)_(any digit)
看起来像:
219211_2
到目前为止,我尝试了很多组合,我认为这个组合最接近解决方案:
/(\\d+)(_)(\\d+)/
如果有办法将最后一个数字(下划线之后的数字)的范围限制为一定数量的数字(例如最大12位数),那就太好了。
我还在学习正则表达式,所以非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
您不需要在PHP中双重转义\\d
。
使用此正则表达式:
"/^(\d+)_(\d{1,12})$/"
\d{1,12}
将匹配1到12个挖掘者答案 1 :(得分:2)
以下内容:
\d+_\d{1,12}(?!\d)
将匹配“字符串中的任何位置”。如果您需要“在开始时”,“在结尾处”或“这是整个事情”,那么您将需要使用锚点修改它
^\d+_\d{1,12}(?!d) - must be at the start
\d+_\d{1,12}$ - must be at the end
^\d+_\d{1,12}$ - must be the entire string
演示:http://regex101.com/r/jG0eZ7
说明:
\d+ - at least one digit
_ - literal underscore
\d{1,12} - between 1 and 12 digits
(?!\d) - followed by "something that is not a digit" (negative lookahead)
最后一件事情很重要,否则它会匹配前12个并忽略第13个。如果您的号码恰好位于字符串的末尾,而您使用的表格我最初只有[^\d]
,那么在特定情况下它将无法匹配。
感谢@sln指出这一点。
答案 2 :(得分:1)
试试这个:
$regex= '~^/(\d+)_(\d+)$~';
$input= '219211_2';
if (preg_match($regex, $input, $result)) {
print_r($result);
}
答案 3 :(得分:0)
试试以下正则表达式:
^(\d+)_(\d{1,12})$