正则表达式需求:截取工作目录路径中第四个反斜杠前的内容
正则表达式解决方案:抓取第四个反斜杠前的内容
正确正则表达式
根据需求分两种场景给出:
- 不包含第四个反斜杠:
^((?:[^\\]*\\){3}[^\\]*) - 包含第四个反斜杠:
^((?:[^\\]*\\){4})
正则逻辑解释
^:强制从字符串开头匹配,避免匹配路径中间的片段(?:[^\\]*\\):非捕获组,匹配「任意数量非反斜杠字符 + 一个反斜杠」的组合{3}:重复上述组合3次,对应前3个反斜杠的完整片段[^\\]*:匹配第四个反斜杠前的最后一段非反斜杠内容(对应不包含第四个反斜杠的场景){4}:将组合重复4次,直接包含第四个反斜杠(对应包含第四个反斜杠的场景)
现有方案问题分析
第一种方案
[^\\].*[\\]:[^\\]仅匹配第一个非反斜杠字符,.*是贪婪匹配,会直接抓取到最后一个反斜杠前的所有内容,完全没有限制反斜杠数量,不符合需求。第二种方案
(?=[\\]){4}.*[\\]:(?=[\\])是正向预查,仅匹配「后面跟着反斜杠」的位置,{4}只是重复这个位置匹配4次但不消耗字符;后续的.*[\\]依然是贪婪匹配到最后一个反斜杠,整个正则逻辑没起到限制第四个反斜杠的作用。
验证示例
以路径 C:\Users\testing\again\later 为例:
- 用不包含第四个反斜杠的正则,捕获结果为
C:\Users\testing\again - 用包含第四个反斜杠的正则,捕获结果为
C:\Users\testing\again\ - 两种正则都不会捕获到第四个反斜杠后的
later部分
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

