首页 > 解决方案 > 一个捕获组中的正则表达式条件匹配

问题描述

我有一个字符串,它可能以以下形式出现:

"filename.first_order.png"
"filename.second_order.png"
"filename.png"
"filename.(jpg|tif|etc)"

我需要匹配包含名称和扩展名的字符串的第一部分 - 但是,如果字符串是一阶/二阶类型,我需要匹配“first_order”/“second_order”作为第二组,而不是“ png”,我无法让这两个条件在一个捕获组中共存。示例匹配:

imageondisk.first_order.png -> [imageondisk, first_order]
anotherfile.png             -> [anotherfile, png]
meetingminutes.jpeg         -> [meetingminutes, jpeg]

我觉得我已经使用了各种前瞻、后视和 ?s 的组合,这一定看起来像是一个没有受过教育的绝望的烂摊子,但无论我做什么,当我将它们结合在一起时,我永远无法得到它们不冲突的结果 -这看起来像

(.+)\.(tif|jpg|<png when not preceded by first/second_order>|<first/second_order, ignoring the .png on the end>)

除了我刚刚进入了一个令人沮丧的非捕获组和环视似乎在同一个地方结束的兔子洞,我觉得我知道的正则表达式比以前少了。

帮助将不胜感激。

标签: regexregex-lookarounds

解决方案


您可以使用此正则表达式,它捕获组 1 中的文件名、组 2 中的任何一阶/二阶字符串以及组 3 中的扩展名:

^([^.]+)(?:\.(.+))?\.(png|jpg|tif)$

正则表达式 101 上的演示


推荐阅读