如何按|分隔字符串且不拆分单/双引号内部的|字符
解决方案
你可以通过匹配目标字段而非直接分割分隔符的方式实现需求,该方案适配单/双引号内特殊字符不拆分的场景,逻辑更稳定。
核心正则表达式
(?<=\||^)\s*(?:"[^"]*"|'[^']*'|[^|]+?)\s*(?=\||$)
正则逻辑说明
(?<=\||^):正向回顾匹配字段起始位置,要么是字符串开头,要么是|的后方\s*:匹配字段前后可能存在的冗余空格- 分支匹配逻辑:
"[^"]*":匹配双引号包裹的所有内容,内部的|会被整体保留'[^']*':匹配单引号包裹的所有内容[^|]+?:匹配未被引号包裹的普通字段,直到遇到下一个|为止
(?=\||$):正向前瞻匹配字段结束位置,要么是字符串结尾,要么是下一个|的前方
代码示例
JavaScript 示例
const str = "aa | bb | \"cc | dd\" | 'ee | ff'"; const regex = /(?<=\||^)\s*(?:"[^"]*"|'[^']*'|[^|]+?)\s*(?=\||$)/g; const result = str.match(regex); console.log(result); // 输出:['aa', 'bb', '"cc | dd"', "'ee | ff'"]
Python 示例
import re raw_str = "aa | bb | \"cc | dd\" | 'ee | ff'" regex = r'(?<=\||^)\s*(?:"[^"]*"|\'[^\']*\'|[^|]+?)\s*(?=\||$)' result = re.findall(regex, raw_str) print(result) # 输出:['aa', 'bb', '"cc | dd"', "'ee | ff'"]
扩展兼容方案
如果你的场景需要支持引号内的转义引号(比如"cc \"test\" | dd"这类格式),只需把正则内的"[^"]*"替换为"[^"\\]*(?:\\.[^"\\]*)*",单引号分支同理替换即可兼容转义场景。
内容的提问来源于stack exchange,提问作者Xiidref
相关产品推荐
相关产品推荐

