正则表达式可选非捕获组匹配结果不符合预期如何解决
问题根因
你之前的正则匹配失效,核心是两点:
- 捕获组用的
.*是贪婪匹配模式,会尽可能向后匹配最长的符合规则的字符串 - 当你把末尾匹配
(的非捕获组设为可选时,贪婪规则会让第三个捕获组直接吞掉-之后到行尾的所有内容,不会给可选的非捕获组预留匹配位置,自然就会把括号里的冗余内容带进GROUP3。
可用正则
直接使用下面的正则即可兼容两种存在/不存在delimiter3的场景:
^(\d+)\. (.*?) - (.*?)(?: \(.*)?$
规则说明
- 开头
^和结尾$是行锚点,固定匹配整行内容,避免跨行匹配出现异常 - 原正则中GROUP2、GROUP3位置的贪婪匹配
.*改为非贪婪匹配.*?,匹配到符合终止条件的第一个位置就停止向后吞内容 - 末尾的
(?: \(.*)?整体设为可选非捕获组:如果行尾存在(开头的剩余内容,就整段匹配但不做捕获;如果不存在这段内容,就直接匹配到行尾,不会把冗余内容划入GROUP3。
匹配结果验证
针对你给出的两个测试样例,捕获结果完全符合预期:
- 样例1:
07. Neospace - Into The Night (Chris Van Buren)- GROUP1:
07 - GROUP2:
Neospace - GROUP3:
Into The Night
- GROUP1:
- 样例2:
13. Atomic Space Orchestra - Starfleet- GROUP1:
13 - GROUP2:
Atomic Space Orchestra - GROUP3:
Starfleet
- GROUP1:
如果你的实际场景中GROUP3的内容本身可能包含
(字符,可以根据实际规则调整终止匹配的边界,比如限定后缀括号只匹配行尾的括号内容,把正则末尾改成(?: \([^)]*\))?$即可,逻辑上可以避免误截断GROUP3内的合法括号内容。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

