正则表达式匹配含可选括号组文本的问题求助
正则表达式适配带/不带括号的编号提取需求
问题背景
现有正则可正常提取无括号的编号数据,但遇到带括号的编号时失效;修改后的正则虽能匹配带括号数据,但会产生多余分组且无法兼容无括号文本:
第一版正则(仅支持无括号)
([A-Z]{2,}-\d+)\(?\s.?([a-zA-Z]+\s?[a-zA-Z]+)\s\d*-\d*\s([a-zA-Z]+\s?[a-zA-Z]+\s?[a-zA-Z]+)
测试数据:
Design No. TAHN-7075 Natural Gray 0997-101 White 0911-101
输出分组:
- TAHN-7075
- Natural Gray
- White
修改版正则(仅支持带括号,有多余分组)
([A-Z]{2,}-\d+\(([^\)]+)\))\(?\s.?([a-zA-Z]+\s?[a-zA-Z]+)\s\d*-\d*\s([a-zA-Z]+\s?[a-zA-Z]+\s?[a-zA-Z]+)
测试数据:
Design No. TAHN-7082(CS-02) Natural Gray 0997-101 White 0911-101
输出分组:
- TAHN-7082(CS-02)
- CS-02
- Natural Gray
- Natural Gray
解决方案
使用以下正则,可同时兼容带/不带括号的编号,且无多余分组:
([A-Z]{2,}-\d+(?:\([^)]+\))?)\s+([a-zA-Z]+\s[a-zA-Z]+)\s\d*-\d*\s+([a-zA-Z]+(?:\s[a-zA-Z]+)?)
正则说明
([A-Z]{2,}-\d+(?:\([^)]+\))?):捕获核心编号部分,其中(?:\([^)]+\))?是可选非捕获组,匹配括号及内部内容([^)]+匹配括号内任意非右括号字符),?表示该部分可存在或不存在,非捕获组避免生成多余分组\s+:匹配一个或多个空格,替代原正则中模糊的\(?\s.?,避免匹配无关字符([a-zA-Z]+\s[a-zA-Z]+):捕获第一个颜色(如Natural Gray)\s\d*-\d*\s+:匹配中间的数字区间(如0997-101)及前后空格([a-zA-Z]+(?:\s[a-zA-Z]+)?):捕获第二个颜色,支持单/双词(如White或Light Gray)
测试验证
无括号数据测试
输入:
Design No. TAHN-7075 Natural Gray 0997-101 White 0911-101
输出分组:
- TAHN-7075
- Natural Gray
- White
带括号数据测试
输入:
Design No. TAHN-7082(CS-02) Natural Gray 0997-101 White 0911-101
输出分组:
- TAHN-7082(CS-02)
- Natural Gray
- White
该正则可直接在正则测试网站调试,移植到VBA时无需调整核心语法(VBA支持非捕获组(?:...))。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

