如何编写正则表达式提取含内部连字符字符串的末尾数字?
解决正则提取末尾数字的问题
你的问题核心是原正则把所有连字符都当成了分隔符,但字符串里存在带连字符的子内容(比如2-Hr),导致[^-\n]+会在遇到这类内部连字符时就停止匹配,没法正确跳过前面的内容定位到末尾的数字。
正确的正则方案
不需要按连字符的数量计数,直接定位到最后一组“空格-空格”分隔符后的内容即可,你的目标数字都是在这种格式的分隔符之后:
最简方案(直接匹配末尾的数字):
- (\d+)$解释:精准匹配字符串末尾的
-(空格+连字符+空格),捕获后面的数字。更严谨的方案(兼容更复杂的前置内容):
.* - (\d+)$解释:
.*匹配任意内容直到最后一个-,再捕获后面的数字,避免前面出现零散连字符干扰。
测试验证
用你的两个字符串测试,都能正确提取目标数字:
Special - VIP - 40→ 捕获结果:402-Hr and 1-Hr - 2-Hour Workshop - 35→ 捕获结果:35
原正则失效原因
原正则(?:[^-\n]+-){2}(.*)$中,[^-\n]+是“匹配非连字符的内容”,遇到2-Hr里的-就会停止匹配,所以第二个字符串里的前两个-会被误判成分隔符,最终匹配到的是Hr and 1-Hr - 2-Hour Workshop - 35,而非目标数字。
内容的提问来源于stack exchange,提问作者Cinji18
相关产品推荐
相关产品推荐

