正则表达式优化:如何将匹配的右括号归入前捕获组
解决方案
要实现你需要的匹配逻辑,只需调整正则的分支结构,单独处理)作为分隔符的情况,修改后的正则如下(启用不区分大小写匹配):
(?<prefix>.+)(?:(?<sep>[)])(?<suffix>[a-z])|(?<suffix>[ ._-]+[a-z]))(?<ext>\.[^.]+)$
正则说明
- 使用命名捕获组让结果更清晰:
prefix:对应你需要的捕获组1,即扩展名前的主体部分;suffix:对应原来的捕获组2,即末尾的字母(或分隔符+字母);ext:文件名的扩展名。
- 分支结构
(?:...|...)处理两种场景:- 当末尾是
)+字母时:(?<sep>[)])(?<suffix>[a-z])会把)归到主体部分(prefix会自动包含这个),因为.+会贪婪匹配到)为止),只把字母放入suffix; - 当末尾是
-、_、.、空格+字母时:(?<suffix>[ ._-]+[a-z])会把分隔符和字母一起放入suffix,prefix停在分隔符之前。
- 当末尾是
测试验证
对于示例
The.Chronicles-A.mp4:prefix:The.Chroniclessuffix:-Aext:.mp4
完全符合你的预期。
对于示例
The.Chronicles.(2001)A.mp4:prefix:The.Chronicles.(2001)suffix:Aext:.mp4
成功将)归入了主体部分(prefix),满足你的需求。
如果你更习惯使用数字捕获组,也可以用以下版本:
(.+)(?:([)])([a-z])|([ ._-]+[a-z]))(\.[^.]+)$
- 数字组对应关系:
- 组1:主体部分(对应命名组
prefix); - 组3/组4:末尾的字母或分隔符+字母(对应命名组
suffix,二选一有值); - 组5:扩展名(对应命名组
ext)。
- 组1:主体部分(对应命名组
内容的提问来源于stack exchange,提问作者Andy Powell
相关产品推荐
相关产品推荐

