正则表达式需求:仅当零或多匹配组有捕获时允许尾随下划线
正则表达式解决方案
针对你的需求——当第一个捕获组未匹配内容时,禁止出现下划线,可以通过带条件判断的正则表达式或分支结构实现。
最终正则表达式(条件判断写法)
^\.?(?:([a-zA-Z0-9]+)(?(1)_|(?!_)))(foobar)\.txt$
逻辑拆解
^\.?:匹配开头可选的英文点(?:([a-zA-Z0-9]+)(?(1)_|(?!_))):非捕获组,核心逻辑在这里([a-zA-Z0-9]+):捕获至少一个字母/数字字符到分组1(?(1)_|(?!_)):条件判断规则:如果分组1有内容,允许匹配下划线;如果分组1为空,通过负向预查(?!_)直接排除下划线的存在
(foobar)\.txt$:捕获固定字符串foobar到分组2,匹配结尾的.txt
测试用例验证
sometext_foobar.txt:匹配,分组1返回sometext,分组2返回foobar_foobar.txt:不匹配(分组1为空但存在下划线,违反规则).foobar.txt:匹配,分组2返回foobar(分组1无内容且无下划线).bcd_foobar.txt:匹配,分组1返回bcd,分组2返回foobar
替代写法(分支结构,更直观)
如果觉得条件判断不够易懂,也可以用分支结构实现相同逻辑:
^(?:\.?([a-zA-Z0-9]+)_|\.?)(foobar)\.txt$
- 分支1:
\.?([a-zA-Z0-9]+)_:匹配「可选点+至少一个字母/数字+下划线」的组合 - 分支2:
\.?:匹配「可选点(无后续字符和下划线)」的情况 - 两个分支二选一后,再匹配
foobar.txt,同样满足需求
内容的提问来源于stack exchange,提问作者RishiD
相关产品推荐
相关产品推荐

