用于逗号分隔文本的正则表达式,带有可选双引号,可以包含反斜杠转义引号

问题描述 投票:0回答:1

我需要一个可以分隔字符串的正则表达式,例如:

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 个)。

任何帮助将不胜感激。

c++ regex boost
1个回答
0
投票

对于您当前的示例,以下正则表达式就足够了:

(?|\h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*|([^,]+|(?<=,)|^(?=,)))

请参阅 regex101 上的演示(演示中的

\n
仅用于多行展示)

它使用分支重置组捕获相同的第一组所需的部分,这应该支持PCRE,甚至增强正则表达式(添加到版本1.42中的ECMAScript语法中)。

此模式涵盖以下情况(交替,优先级从左到右)

  1. \h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*
    捕获
    \h*
    任意数量的水平空间包围的引用部分内的内容 - 包含任意数量的 转义引号
  2. [^,]+
    不带引号的部分:一个或多个不是逗号的字符。
  3. (?<=,)
    任何剩余的空格都以逗号开头(lookbehind)。
  4. ^(?=,)
    如果字符串/行的
    ^
    开头有任何空白,例如
    ,a

如果您还需要修剪空间,请尝试此版本,但请注意,它会 一般来说,如果您的环境中可用,建议使用 csv 解析器。

© www.soinside.com 2019 - 2024. All rights reserved.