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



我需要分离以下字符串:"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]

我怎么能忽略这个空格,在的末尾保留引号中的空字符串

不要使用正则表达式。虽然他们可以做到这一点,但您正在匹配嵌套的东西,这充其量会使正则表达式变得非常混乱和复杂。使用解析器。类似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
""

我同意@Sobrique的解决方案。如果您仍然希望使用正则表达式,则需要选择多余空白的位置。用这个来修剪你的所有线条:

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

如果你想在引号前后留出空格,你可以有这样的正则表达式:

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

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

最新更新