You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构造无重复前置断言的正则:匹配至最后指定字符或字符串末尾

正则表达式优化方案

需求:构造正则表达式,从i_开始匹配,到最后一个_的位置截止;如果字符串里没有_,就匹配到末尾。

测试输入

i_123_Mobile
i_123_abc_Mobile
i_123aa_abcdaeedg_Desktop
i_abc123

预期输出

123
123_abc
123aa_abcdaeedg
abc123

你之前用(?<=i_).*(?=_)|(?<=i_).*$虽然能实现需求,但重复写了(?<=i_),这里给你两种优化写法:

写法一:利用捕获组简化逻辑

直接用捕获组提取目标内容,正则如下:

i_(.*)(?:_[^_]*)?$

逻辑说明:

  • i_:匹配开头的固定前缀
  • (.*):捕获我们需要的目标内容,贪婪匹配会自动停在最后一个_的前面,因为后面的非捕获组会匹配最后一个_及其后续所有内容
  • (?:_[^_]*)?:非捕获组,匹配可选的“最后一个_+后续内容”,?表示这个部分可以不存在
  • $:匹配字符串结尾

使用时直接提取第一个捕获组的内容即可,无需重复写前置断言。

写法二:合并正向断言

如果偏好使用断言而不依赖捕获组,可以用合并后的断言写法:

(?<=i_).*(?=(?:_[^_]*)?$)

逻辑说明:

  • (?<=i_):前置断言,确保匹配内容在i_之后
  • .*:贪婪匹配目标内容
  • (?=(?:_[^_]*)?$):后置断言,要求匹配内容的后面要么是“最后一个_+后续内容+结尾”,要么直接是结尾,自动适配有无_的两种情况

这两种写法都能避免重复使用前置断言,同时满足所有测试用例的需求。

内容的提问来源于stack exchange,提问作者OfirD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:42:38