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

时间:2008-10-08 03:09:41

标签: regex csv

让我先说一下,在谈到RegEx时,我是一个完全的业余爱好者,并且仅在几天前开始。我正在尝试解决格式化文件的问题,并且遇到了特定类型数据的问题。输入文件的结构如下:

Two words,Word,Word,Word,"Number, number"

我需要做的就是像这样格式化......

"Two words","Word",Word","Word","Number, number"

我有一个RegEx模式

s/,/","/g

工作,除了它还替换已引用的Number,number部分中的逗号,这会导致字段分离并中断文件。基本上,我需要修改我的模式以用“,”[引号逗号引号]替换逗号,但仅当该逗号后面没有空格时。请注意,其他字段的逗号后面不会有空格,只有分隔的数字列表。

我设法写了

s/,[A-Za-z0-9]/","/g

,在匹配相应的字符串时,将替换逗号和后面的字母。我听说过反馈并认为可能是我需要使用的东西?我的理解是

s/(,)[A-Za-z0-9]\b

应该有效,但事实并非如此。

有人有想法吗?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

s/,([^ ])/","$1/将匹配“,”后跟“not-a-space”,捕获非空格,然后用捕获的部分替换整个事物。

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

如果您正在使用Perl或以其他方式访问具有否定前瞻功能的正则表达式引擎,则s/,(?! )/","/(“,”后面没有空格)可以正常工作。

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

答案 2 :(得分:0)

此问题类似于:Replace patterns that are inside delimiters using a regular expression call

这可行:

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

答案 3 :(得分:0)

看起来你正在使用Sed。

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

通过sed,您的命令将是:

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

请注意,您仍然必须在字符串的开头和结尾添加双引号。