如何按逗号分割文本且忽略字符串内逗号(适配含不配对双引号场景)
解决思路
核心问题是原有正则依赖双引号严格配对的前提失效,有两种落地性强的解决方案:
方案1:手写状态机遍历(最稳定,无边界兼容问题)
完全不依赖正则,逐字符处理逻辑可控,适配任意不规范引号场景:
状态定义:
in_quotes:标记当前是否处于字符串内部current_field:缓存当前正在拼接的字段内容
处理逻辑:
- 初始化
in_quotes = False,current_field = [],结果列表为空 - 遍历文本的每一个字符,同步检查当前字符的下一位字符:
- 若当前字符为
":- 若
in_quotes为False:标记进入字符串,将"加入current_field,in_quotes = True - 若
in_quotes为True:将"加入current_field,检查下一位字符是否为,或已到文本末尾,若是则标记退出字符串in_quotes = False
- 若
- 若当前字符为
,:- 若
in_quotes为False:将current_field拼接为字符串存入结果列表,清空current_field - 若
in_quotes为True:直接将,加入current_field
- 若
- 其他字符直接加入
current_field
- 若当前字符为
- 遍历结束后将剩余的
current_field存入结果列表
Python 实现示例
def custom_split(text): res = [] current = [] in_quotes = False n = len(text) for i, c in enumerate(text): if c == '"': current.append(c) if not in_quotes: in_quotes = True else: # 检查下一个字符是否是逗号或末尾,判断是否字段结束 if i == n-1 or text[i+1] == ',': in_quotes = False elif c == ',': if not in_quotes: res.append(''.join(current)) current = [] else: current.append(c) else: current.append(c) res.append(''.join(current)) return res # 测试示例文本 test_text = '355,170102,204500,204509,10,"SOME TEXT 10"","COM","COM","Not Split"' print(custom_split(test_text))
运行输出完全符合预期:
['355', '170102', '204500', '204509', '10', '"SOME TEXT 10"', '"COM"', '"COM"', '"Not Split"']
方案2:改用匹配字段的正则(无需复杂逻辑,适合快速实现)
放弃分割逗号的思路,改为直接匹配每个合法字段,正则规则为:匹配不带逗号的普通字段,或者双引号包裹的、后面紧跟逗号或行尾的字符串字段。
正则表达式:"[^"]*"(?=,|$)|[^,]+
Python 实现示例
import re test_text = '355,170102,204500,204509,10,"SOME TEXT 10"","COM","COM","Not Split"' res = re.findall(r'"[^"]*"(?=,|$)|[^,]+', test_text) print(res)
运行输出和状态机方案一致。
内容的提问来源于stack exchange,提问作者Md. Parwez Akhtar
相关产品推荐
相关产品推荐

