正则表达式[^\/]\d{4}为何无法匹配行首的四位数字?
为啥行首的四位数字匹配不到?
踩过这个正则坑的人来给你唠唠!核心问题全在那个[^\/]上,咱们一点点说:
先拆解你的正则逻辑
你写的[^\/]\d{4}其实是两个部分:
[^\/]:这是个否定字符类,要求必须匹配一个实实在在的字符,而且这个字符不能是斜杠/;\d{4}:匹配连续四位数字。
行首匹配失败的原因
当四位数字出现在文件/行的最开头时,它的前面根本没有任何字符!这时候[^\/]找不到符合要求的字符来匹配,整个正则自然就“卡壳”了,匹配失败。
举个直观的例子:
- 比如
01/01/2015里的2015,前面有个1(不是斜杠),[^\/]能匹配到这个1,后面跟着的2015也能被\d{4}匹配,所以整个正则生效; - 但如果是文件开头的
2014(i),2014前面啥都没有,[^\/]没东西可匹配,直接就放弃了。
怎么改才能解决问题?
根据你的需求,给你两个实用方案:
方案1:保留原匹配范围(包含前置非斜杠字符)
把[^\/]改成(?:^|[^\/]),意思是“要么是行首位置,要么是一个非斜杠字符”:
(?:^|[^\/])\d{4}
(?:...)是个非捕获组,不会额外存储匹配内容,只是用来把两个条件放一起;^匹配行首的空位置,不需要消耗字符,完美覆盖了“前面没字符”的情况。
方案2:只匹配四位数字(更精准)
如果你只想拿到四位数字,不想把前面的非斜杠字符也包含在结果里,用负向后行断言更合适:
(?<!\/)\d{4}
(?<!\/)是个零宽断言,它只会检查“当前位置前面不是斜杠”,不会消耗任何字符;- 行首的位置前面没有字符,自然满足“不是斜杠”的条件,所以能匹配到行首的四位数字;
- 要是遇到
/2016这种情况,前面是斜杠,断言不满足,就不会匹配,刚好符合你不想匹配斜杠后四位数字的潜在需求。
内容的提问来源于stack exchange,提问作者WouldRatherBuildAMotor
相关产品推荐
相关产品推荐

