不要使用正则表达式。虽然他们可以做到这一点,但您正在匹配嵌套的东西,这充其量会使正则表达式变得非常混乱和复杂。使用解析器。类似
我需要分离以下字符串:"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
两者都会移除不想要的命中,但会产生不同的结果。