我需要分隔以下字符串:"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]
如何忽略此空格,在末尾的引号引号中保留空字符串
答案 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
两者都会消除不必要的命中,但会产生不同的结果。