0

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

两个字,Word,Word,Word,"数字,数字"

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

“两个字”、“字”、“字”、“字”、“数、数”

我有一个 RegEx 模式

s/,/","/g

工作,除了它还替换了已经引用的 Number, number 部分中的逗号,这会导致字段分隔并破坏文件。本质上,我需要修改我的模式以用 "," [quote comma quote] 替换逗号,但前提是该逗号后面没有空格。请注意,其他字段永远不会在逗号后面有空格,只有分隔的数字列表。

我设法写了

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

其中,在匹配适当的字符串时,将替换逗号和以下字母。我听说过反向引用并认为这可能是我需要使用的?我的理解是

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

应该工作,但它没有。

有人有想法吗?

4

4 回答 4

2

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

于 2008-10-08T03:24:24.153 回答
1

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

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

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

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

于 2008-10-08T03:18:42.403 回答
0

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

这可以工作:

s/"([^"]*)"|([^",]+)/"$1$2"/g
于 2008-10-08T03:43:24.553 回答
0

看起来你正在使用 Sed。

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

通过 sed,您的命令将是:

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

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

于 2008-10-08T03:47:50.457 回答