PHP preg_match匹配字符串末尾空格后接数字且空格前有内容的正则规则
原有正则问题分析
你之前使用的#^(.)* (\d*)$#存在两个明显缺陷:
- 开头的
(.)*等价于.*,允许匹配0长度的空内容,当输入为1212时,.*匹配开头的空字符,后续的\d*刚好匹配剩余的空格+数字,直接触发误匹配。 - 结尾的
\d*允许匹配0个数字,会错误命中以空格结尾、没有数字的无效字符串。
正确正则方案
修正后的正则如下:
#^.+\s(\d+)$#
规则逻辑说明:
^.+:要求字符串开头到数字前的空格之间,至少存在1个任意字符,直接排除了「空格+数字直接出现在开头」的无效场景\s:匹配数字前面的单个空格,如果你需要兼容多个空格间隔的场景,可以改成\s+(\d+):匹配结尾的1位及以上数字,结果会存入捕获分组1$:锚定匹配到字符串末尾,保证匹配到的数字确实是结尾内容
如果你的文件名允许包含换行符,可以在正则末尾加s修饰符,让.可以匹配换行符,写法变为#^.+\s(\d+)$#s。
使用示例
// 有效场景测试 $str = 'a b 1212'; preg_match('#^.+\s(\d+)$#', $str, $matches); if (isset($matches[1])) { var_dump($matches[1]); // 输出 string(4) "1212" } // 无效场景测试 $str = ' 1212'; preg_match('#^.+\s(\d+)$#', $str, $matches); var_dump(isset($matches[1])); // 输出 bool(false)
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

