Regex 正则表达式部分字符串CSV匹配

Regex 正则表达式部分字符串CSV匹配,regex,csv,Regex,Csv,让我先说一句,我是一个完全业余的正则表达式爱好者,几天前才开始。我试图解决格式化文件的问题,但遇到了一个特定类型数据的问题。输入文件的结构如下所示: Two words,Word,Word,Word,"Number, number" 两个字,字,字,字,“数字,数字” 我需要做的是像这样格式化它 "Two words","Word",Word","Word","Number, number" “两个字”,“字”,“字”,“字”,“数”,“数” 我有一个正则表达式模式的 s/,/","/g s/,

让我先说一句,我是一个完全业余的正则表达式爱好者,几天前才开始。我试图解决格式化文件的问题,但遇到了一个特定类型数据的问题。输入文件的结构如下所示:

Two words,Word,Word,Word,"Number, number" 两个字,字,字,字,“数字,数字” 我需要做的是像这样格式化它

"Two words","Word",Word","Word","Number, number" “两个字”,“字”,“字”,“字”,“数”,“数” 我有一个正则表达式模式的

s/,/","/g s/,/“,”/g 工作,除了它还替换了已被引用的数字,数字部分中的逗号,这会导致字段分隔并断开文件。基本上,我需要修改我的模式,将逗号替换为“,”[quote comma quote],但仅当逗号后面没有空格时。请注意,其他字段的逗号后面永远不会有空格,只有分隔的数字列表

我设法写了一篇文章

s/,[A-Za-z0-9]/","/g s/,[A-Za-z0-9]/“,”/g 在匹配适当的字符串时,将替换逗号和下面的字母。我听说过反向引用,并认为这可能是我需要使用的?我的理解是

s/(,)[A-Za-z0-9]\b s/(,)[A-Za-z0-9]\_b 应该行得通,但不行

有人有想法吗?

s/,([^])/,“$1/
将匹配一个“
”后跟一个“非空间”,捕获非空间,然后用捕获的部分替换整个东西

根据您使用的正则表达式引擎,您可能正在编写
\1
或其他内容,而不是
$1

如果您正在使用Perl或以其他方式访问具有负前瞻性的正则表达式引擎,
s/,(?!)/,“/
(a“
”后面不跟空格)可以工作

但是,您的输入看起来像CSV,如果它真的像,您最好使用真正的CSV解析器而不是正则表达式来解析它。还有很多其他奇怪的情况需要担心。

s/,([^])/,“$1/
将匹配一个“
”,后跟一个“not-a-space”,捕获非空间,然后用捕获的部分替换整个对象

根据您使用的正则表达式引擎,您可能正在编写
\1
或其他内容,而不是
$1

如果您正在使用Perl或以其他方式访问具有负前瞻性的正则表达式引擎,
s/,(?!)/,“/
(a“
”后面不跟空格)可以工作


但是,您的输入看起来像CSV,如果它真的像,那么最好使用真正的CSV解析器而不是正则表达式来解析它。还有很多其他奇怪的情况需要担心。

我的经验是,正则表达式的使用不是很好。如前所述,真正的CSV解析器可以更好地处理CSV文件。您没有标记语言,所以很难说,但在perl中,我使用Text::CSV_XS或DBD::CSV(允许SQL访问CSV文件,就像它是一个表一样,当然,它在封面下使用Text::CSV_XS)。比我自己滚动要简单得多,比使用正则表达式要健壮得多。

我的经验是,这不是正则表达式的一个很好的用途。如前所述,真正的CSV解析器可以更好地处理CSV文件。您没有标记语言,所以很难说,但在perl中,我使用Text::CSV_XS或DBD::CSV(允许SQL访问CSV文件,就像它是一个表一样,当然,它在封面下使用Text::CSV_XS)。比自己滚动要简单得多,比使用正则表达式要健壮得多。

这个问题类似于:

这可能会起作用:

s/"([^"]*)"|([^",]+)/"$1$2"/g

这个问题类似于:

这可能会起作用:

s/"([^"]*)"|([^",]+)/"$1$2"/g

看起来你在用Sed

虽然您的模式似乎有点不一致,但我假设您希望每个用逗号分隔的项目都有引号。否则,您将看到正则表达式无法处理的计算复杂性区域

通过sed,您的命令将是:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

请注意,您仍然需要在字符串的开头和结尾加上双引号。

看起来您正在使用Sed

虽然您的模式似乎有点不一致,但我假设您希望每个用逗号分隔的项目都有引号。否则,您将看到正则表达式无法处理的计算复杂性区域

通过sed,您的命令将是:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

请注意,您仍然需要在字符串的开头和结尾加上双引号。

我希望通过CSV解析器完成这项工作,但我得到了这些文件的原样,而没有实际格式的发言权。所以我一直在摆弄RegEx.s/,(?!)/,“/工作得很好,谢谢。我正在使用Perl,以便在发送文件时可以对其运行脚本。保存在解析器中打开它并在那里使用它。此外,我想学习Perl和RegEx,所以一石二鸟。谢谢你的帮助:)。我想通过CSV解析器来完成这项工作,但我得到了这些文件的原样,而没有任何实际格式的发言权。所以我一直在摆弄RegEx.s/,(?!)/,“/工作得很好,谢谢。我正在使用Perl,以便在发送文件时可以对其运行脚本。保存在解析器中打开它并在那里使用它。此外,我想学习Perl和RegEx,所以一石二鸟。谢谢你的帮助:)。嘿,这就实现了艾萨克想要的,而不是他要求的:)你可以更喜欢一点,也可以处理CSV的报价。。。但当预构建的CSV解析器可以做得更好时,用正则表达式处理它并没有多大意义。首先,我想学习Perl,然后RegEx似乎可以解决这个问题。第二,我定期收到这些文件,能够对它们运行脚本可以节省我很多时间。嘿,这就实现了Isaac想要的,而不是他要求的:)你可以更喜欢一点,也可以处理CSV的报价。。。但是,当需要时,用正则表达式处理它没有多大意义