在逗号和引号之间提取文本,忽略perl中的转义字符

时间:2016-01-04 09:52:12

标签: regex string perl split

我需要分隔以下字符串:"ABC", err, "%. Exiting." , "Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\".",0,-1,"" 到逗号和引号之间的字符。我在perl中使用以下正则表达式:\(".*?"|[^",]+)(?=\s*,|\s*$)\g。这给了我以下输出,其中标识了额外的空间。

"ABC"
err
"%. Exiting."
  #[Unwanted Match]
"Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\"."
0
-1
"" #[This Match is required]

如何忽略此空格,在末尾的引号引号中保留空字符串

2 个答案:

答案 0 :(得分:4)

不要使用正则表达式。虽然他们可以做到,但你可以匹配嵌套的东西,这最多使得正则表达式变得非常混乱和复杂。使用解析器。像Text::ParseWords

#!/usr/bin/env perl
use strict;
use warnings;

use Text::ParseWords;

my $line = '"ABC", err, "%. Exiting." , "Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\".",0,-1,""';
my @words = parse_line( ',', 1, $line );
print join ("\n", @words );

给出了:

"ABC"
 err
 "%. Exiting." 
 "Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\"."
0
-1
""

答案 1 :(得分:2)

我同意@ Sobrique的解决方案。如果您仍想使用正则表达式,则需要选择您想要额外空白区域的位置。用它来修剪你的所有线条:

/\s*(".*?"|[^",]+)\s*(?=\s*,|\s*$)/g

如果要在引号之前和之后允许空格,可以使用如下的正则表达式:

/(\s*".*?"\s*|[^",]+)(?=\s*,|\s*$)/g

两者都会消除不必要的命中,但会产生不同的结果。