2008-10-08 95 views
0

让我通过说我是一个完整的业余爱好者来谈RegEx,并且在几天前才开始。我试图解决一个格式化文件的问题,并且遇到了特定类型的数据。输入文件的结构是这样的:正则表达式部分字符串CSV匹配

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

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

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

我有过

s/,/","/g

工作正则表达式模式,但它也会替换已经引用的数字,数字部分中的逗号,这会导致字段分隔并中断文件。实际上,我需要修改我的模式以用逗号“,”[逗号引用]替换逗号,但只有当该逗号后面没有空格时。请注意,其他字段在逗号后面永远不会有空格,只有分隔号码列表。

我设法写上去

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

其中,同时匹配相应的字符串,将取代逗号和下面的字母。我听说过反向引用,认为这可能是我需要使用的?我的理解是,

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

应该工作,但它没有。

任何人有想法?

回答

1

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

根据你正在使用哪个正则表达式引擎,你可能会写\1或其他东西,而不是$1

如果您使用Perl或以其他方式访问带有负向视图的正则表达式引擎,则可以使用s/,(?!)/","/(“,”后面没有空格)。

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

+0

我想通过CSV解析器来做到这一点,但我被赋予了这些文件,因为它们没有我在实际格式中的任何说法。所以我卡在RegEx上摆弄。 – 2008-10-08 03:23:14

+0

s /,(?!)/“,”/ 工作完美,谢谢。我使用Perl,因此我可以在发送文件时针对这些文件运行脚本。保存在解析器中并在那里使用。此外,无论如何,我还是想学习Perl和RegEx,这样一举两得。谢谢你的帮助 :)。 – 2008-10-08 04:28:39

2

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

0

看起来你正在使用桑达。

虽然您的模式似乎有点不一致,但我假设您希望每个用逗号分隔的项目都有引号。否则,你正在寻找计算复杂性正则表达式并不意味着处理的区域。

通过sed的,你的命令是:

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

注意,你仍然得把双引号字符串的开头和结尾。