【发布时间】:2018-05-08 10:12:29
【问题描述】:
我正在使用 perl 来解析 CSV 文件。我使用正则表达式而不是任何库来解析它。我知道,有可用的 CSV 解析器库,而且不止一个,但我刚刚决定要使用 REGEX。
我为此创建了一个我认为非常不错且有效的正则表达式。我最初创建了其他应用程序,它们仅使用正则表达式来解析文件。我想在这种情况下重复使用它。
我想用perl的美把它放在一行里:
my $text = '"",hi there,"","2018-04-23,\" 13:14:53",,hostname,mac,"ipaddress",199';
my @data = $text =~ m/(?:^|,)(?:"(|.*?[^\\])"|([^,]*))(?:|$)/g;
但是,当我在单行中执行此操作时,perl 正则表达式甚至会捕获非捕获组。
这是一个测试代码:
my $text = '"",hi there,"","2018-04-23,\" 13:14:53",,hostname,mac,"ipaddress",199';
my @data = $text =~ m/(?:^|,)(?:"(|.*?[^\\])"|([^,]*))(?:|$)/g;
foreach (@data) { print "a --${_}--\n"; }
while ($text =~ m/(?:^|,)(?:"(|.*?[^\\])"|([^,]*))(?:|$)/cg) {
print "b --${1}${2}--\n";
}
“a”转储的结果是:
a ----
a ----
a ----
a --hi there--
a ----
a ----
a --2018-04-23,\" 13:14:53--
a ----
a ----
a ----
a ----
a --hostname--
a ----
a --mac--
a --ipaddress--
a ----
a ----
a --199--
您可以看到额外的空行,而不是“b”转储的正确结果:
b ----
b --hi there--
b ----
b --2018-04-23,\" 13:14:53--
b ----
b --hostname--
b --mac--
b --ipaddress--
b --199--
有没有人遇到过这个问题? 感谢您的回答/想法/错误发现。
【问题讨论】:
-
说真的 - 正则表达式是这个工作的错误工具。我知道你说“你想使用它”。但是... CSV 是上下文相关的 - 它可以包含嵌套引号、换行符等。
regex不是上下文相关的,因此它永远不会穷举。Text::CSV擅长它的工作。 -
“我想使用 perl 的美,把它放在一行中” “Perl 的美”不在于编写难以理解的代码来复制经过验证的功能测试模块。
-
您的字符串
"",hi there,"","2018-04-23,\" 13:14:53",,hostname,mac,"ipaddress",199不是有效的 CSV 数据。 -
(?:|$)没有任何意义:它总是匹配的。
标签: regex perl regex-group