62,614
社区成员
发帖
与我相关
我的任务
分享
(?<=^(?:[^\/]+\/){0})[^\/]+
(?<=^(?:[^\/]+\/){3})[^\/]+
其中的数字含义为 n - 1。
正则引擎是从以左往右的顺序为主的,所以一般即便支持也只是支持简单的、固定好字符串长度的 look-behind 行为,此例子中的 look-behind 部分正则长度是未知的。
先来看看下面用最新版 Chrome 测试的结果:
可以看到,虽然新版 Chrome 的 JS 已经支持如上正则的功能(似乎 .NET 也支持),但效果很不佳。第一次构建正则得花费将近四分钟,如果放到程序中,这样的卡顿影响可是致命性灾难呀。故而不建议使用此方案,其它另几种常用语言我也测试了都不支持,而Java我没有环境暂时没测试,但细想一下这几十年来 Java 的虚拟机那么多,可想而知未定长度的 look-behind 正则行为很大概率是不具备稳定性的。
放弃此方案吧。
^(?:[^\/]+\/){0}([^\/]+)
^(?:[^\/]+\/){1}([^\/]+)
^(?:[^\/]+\/){3}([^\/]+)
^(?:[^\/]+\/){5}([^\/]+)
^(?:[^\/]+\/){6}([^\/]+)
^(?:[^\/]+\/){7}([^\/]+)
花括号内的数字表示 n - 1。最右边的圆括号匹配内容会被存入分组1中,因此你可以通过代码获取分组1的值,分组1的值内容如图中文本的绿色部分:
===============================
如果你的引擎支持,可以使用方案2:
^([^\/]+\/){}(*SKIP)(?!)|[^\/]+
^([^\/]+\/){1}(*SKIP)(?!)|[^\/]+
^([^\/]+\/){3}(*SKIP)(?!)|[^\/]+
以上3条正则分别表示第1部分、第2部分、第4部分。
其中的数字表示要左侧要跳过的诸如“xxx/”段落个数,
如无需跳过时要留空,如:
^([^\/]+\/){}(*SKIP)(?!)|[^\/]+
也等同于:
[^\/]+
匹配图如下:
===============================
最后是支持所有引擎的方案3:
这个就比较有意思了,可以将字符串先倒转,匹配结束再倒转回来,正则也是反着写。
正则如下:
[^\/]+(?=(?:\/[^\/]+){0}$)
[^\/]+(?=(?:\/[^\/]+){1}$)
[^\/]+(?=(?:\/[^\/]+){3}$)
[^\/]+(?=(?:\/[^\/]+){5}$)
[^\/]+(?=(?:\/[^\/]+){6}$)
[^\/]+(?=(?:\/[^\/]+){7}$)
其中数字也是表示原字符串中左侧要跳过的“xxx/”片段数量
匹配结果如图:
此方案适合替换内容,只不过多了逆转工序,但兼容性最佳,所有引擎都支持,即便需求更复杂也任由你扩展,只是不要忘了正则得按颠倒后的字符串内容顺序来写。
最后以 JavaScript 和 Python 和 vba(vb6) 的代码运行Demo作为结尾(Java 我现在没有运行环境,所以不能示范了):
^([^\/]+\/){4}
变动其中的数字就是对应的 n
匹配如下图,可以放大了看: