让我先说一下,在谈到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
应该有效,但事实并非如此。
有人有想法吗?
答案 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'
请注意,您仍然必须在字符串的开头和结尾添加双引号。