如何编写正则表达式,提取首个斜杠后到第二个连字符前的内容(第二个连字符可能不存在)
正则匹配失败原因与修复方案
原有正则的核心缺陷
之前使用的(?<=\/)(.*)(?=-)存在两个明显问题:
- 贪婪匹配溢出:
.*是贪婪量词,会尽可能匹配更多字符,最终匹配到整个字符串最后一个连字符的前一位,对thisIs/My-7777-Any-other-text的匹配结果为My-7777-Any-other,远超出预期范围。 - 无连字符场景完全失效:末尾的
(?=-)是正向预查,要求匹配结束位置后必须跟随连字符,第二个测试字符串thisIs/My-7777末尾无连字符,无法匹配到任何内容。
适配需求的正则写法
根据「提取首个斜杠之后、第二个连字符之前的内容,第二个连字符可能不存在」的核心要求,可使用否定字符类规避贪婪匹配问题,正则为:(?<=/)[^-]+-[^-]+
匹配效果验证
- 输入
thisIs/My-7777-Any-other-text:匹配结果为My-7777(精准定位到斜杠后的第二个连字符前) - 输入
thisIs/My-7777:匹配结果为My-7777(无第二个连字符时自动匹配到字符串末尾)
如果需要固定提取数字部分为3位,得到目标内容My-777,可调整正则为:(?<=/)[^-]+-\d{3}
调整后匹配效果
- 输入
thisIs/My-7777-Any-other-text:匹配结果为My-777 - 输入
thisIs/My-7777:匹配结果为My-777
内容的提问来源于stack exchange,提问作者eVolve
相关产品推荐
相关产品推荐

