让我先说一下,在谈到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

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

有人有想法吗?

有帮助吗?

解决方案

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

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

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

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

其他提示

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

此问题类似于:使用正则表达式调用替换分隔符内的模式

这可行:

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

看起来你正在使用Sed。

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

通过sed,您的命令将是:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top