PCRE正则表达式如何捕获除末尾两位数字外的字符串?
PCRE正则捕获末尾两位数字前的目标内容
针对你提到的test01、abcd02、xyz05这类末尾固定两位数字的字符串,要捕获前面的目标部分,有两种实用的PCRE正则方案,可根据实际场景选择:
方案1:通用匹配(兼容前面含数字的场景)
如果目标字符串前面的内容可能包含数字(比如abc12301这类情况),但始终保证最后两位是数字,用这个正则:
^(.*?)\d{2}$
正则拆解:
^:锚定字符串起始位置,避免匹配中间片段(.*?):非贪婪捕获组,匹配任意字符(默认不含换行,若要支持换行需加s修饰符,即/^(.*?)\d{2}$/s),直到遇到后面的两位数字为止\d{2}:精确匹配两位阿拉伯数字$:锚定字符串结束位置,确保最后两位确实是字符串的结尾
方案2:精准匹配(仅前面为非数字内容)
如果确定前面的内容完全不含数字,用这个更严谨的正则:
^(\D*)\d{2}$
正则拆解:
\D*:匹配任意数量的非数字字符,相比.*?更精准,避免误匹配不需要的内容- 其余部分和方案1一致,确保末尾是两位数字
示例验证
比如在PHP中使用方案1的代码:
$targets = ["test01", "abcd02", "xyz05", "abc12301"]; foreach ($targets as $str) { if (preg_match('/^(.*?)\d{2}$/', $str, $matches)) { echo "原字符串:{$str} → 捕获内容:{$matches[1]}\n"; } }
输出结果:
原字符串:test01 → 捕获内容:test 原字符串:abcd02 → 捕获内容:abcd 原字符串:xyz05 → 捕获内容:xyz 原字符串:abc12301 → 捕获内容:abc123
内容的提问来源于stack exchange,提问作者DevOpsWorld
相关产品推荐
相关产品推荐

