求助一个正则问题,看似简单,实在没想出来

QYworld 2020-03-14 11:04:23
Glass / HD / Sc1 / Good / ABC / Z / 111

类似这样一个字符创,想匹配出第n个 "/" 和 "/" 之前的字符串的话,怎么写正则?
比如第一个是Glass,第4个是Good
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
laserw9 2020-03-15
  • 打赏
  • 举报
回复
还有个最容易想到,但兼容性最差、极不稳定的方案4: 这个方案很多引擎都不支持,但由于突然发现最新版的 Chrome 居然对 JS 支持这样的正则功能,所以还是把它写出来。 正则代码举例如下:
(?<=^(?:[^\/]+\/){0})[^\/]+
(?<=^(?:[^\/]+\/){3})[^\/]+
其中的数字含义为 n - 1。 正则引擎是从以左往右的顺序为主的,所以一般即便支持也只是支持简单的、固定好字符串长度的 look-behind 行为,此例子中的 look-behind 部分正则长度是未知的。 先来看看下面用最新版 Chrome 测试的结果: 可以看到,虽然新版 Chrome 的 JS 已经支持如上正则的功能(似乎 .NET 也支持),但效果很不佳。第一次构建正则得花费将近四分钟,如果放到程序中,这样的卡顿影响可是致命性灾难呀。故而不建议使用此方案,其它另几种常用语言我也测试了都不支持,而Java我没有环境暂时没测试,但细想一下这几十年来 Java 的虚拟机那么多,可想而知未定长度的 look-behind 正则行为很大概率是不具备稳定性的。 放弃此方案吧。
laserw9 2020-03-15
  • 打赏
  • 举报
回复
重新回答下,写个完整点的,共有3个方案,方案1由我上面的答案补充而得。 =============================== 兼容所有正则引擎的方案1:
^(?:[^\/]+\/){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 我现在没有运行环境,所以不能示范了):
qybao 2020-03-15
  • 打赏
  • 举报
回复
我觉得没必要用正则,字符串分割一下就好了
比如
String s = "Glass / HD / Sc1 / Good / ABC / Z / 111";
String reg = "\\s*/\\s*";
System.out.printf("%s, %s\n", s.split(reg)[0], s.split(reg)[3]); //把s分割成数组,取第一个和第4个元素,数组下标从0开始
laserw9 2020-03-15
  • 打赏
  • 举报
回复
RegExp:
^([^\/]+\/){4}
变动其中的数字就是对应的 n 匹配如下图,可以放大了看:

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧