我需要一个可以分隔字符串的正则表达式,例如:
1st, 2nd=second, "3rd=third","4th = forth",,"6th=\"this, is, the, sixth\""
进入
1st // not surrounded
2nd=second // not surrounded
3rd=third // surrounded
4th = forth // surrounded, keep the blank in the middle
// empty string
6th="this, is, the, sixth" // the scaped dbl-quotes and commas in the middle should be kept
请注意,如果这些部分没有逗号或双引号,则它们可能会或可能不会被包围,但如果它们有特殊字符,则应将它们包围起来,并且双引号必须用反斜杠转义。另外,应保留空值(如第 5 个)。
任何帮助将不胜感激。
对于您当前的示例,以下正则表达式就足够了:
(?|\h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*|([^,]+|(?<=,)|^(?=,)))
请参阅 regex101 上的演示(演示中的
\n
仅用于多行展示)
它使用分支重置组来捕获相同的第一组所需的部分,这应该支持PCRE,甚至增强正则表达式(添加到版本1.42中的ECMAScript语法中)。
此模式涵盖以下情况(交替,优先级从左到右)
\h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*
捕获 被 \h*
任意数量的水平空间包围的引用部分内的内容 - 包含任意数量的 转义引号。[^,]+
不带引号的部分:一个或多个不是逗号的字符。(?<=,)
任何剩余的空格都以逗号开头(lookbehind)。^(?=,)
如果字符串/行的 ^
开头有任何空白,例如,a
如果您还需要修剪空间,请尝试此版本,但请注意,它会 一般来说,如果您的环境中可用,建议使用 csv 解析器。