经过一番游戏,我想出了一种在单/双引号中捕捉角色的方法:
['"](?:[^'"]*?(?:\\")*)*["']
不确定这是否完全正确。无论如何,我现在正试图匹配所有这些。
示例:
'stringA' '\"stringB\"' variableA variableB
上述正则表达式匹配:'stringA'
'\"stringB\"'
我想与variableA
variableB
有没有办法可以用Perl
实现这个目标?我试图使用negative/positive lookahead/behinds
,但我遇到了问题,因为lookbehind
\s*
{{1}}是不允许的。
感谢您的帮助。
答案 0 :(得分:1)
使用PCRE动词(*SKIP)(*F)
,
['"](?:[^'"]*?(?:\\")*)*["'](*SKIP)(*F)|\S+
['"](?:[^'"]*?(?:\\")*)*["']
匹配双引号或单引号中的字符串。(*SKIP)(*F)
导致上述模式失败。并尝试匹配|
运算符右侧的模式与剩余的字符串。\S+
匹配除双引号或单引号字符串外的一个或多个非空格字符。答案 1 :(得分:0)
您可以使用如下所示的长复杂正则表达式:
my @words = split m{
' (?: [^'\\]* | \\. )* ' (*SKIP)(*F)
|
" (?: [^"\\]* | \\. )* " (*SKIP)(*F)
|
\s+
}x, $_;
但是,我建议使用Text::ParseWords
:
#!/usr/bin/perl -w
use strict;
use warnings;
use Text::ParseWords;
while (<DATA>) {
my @words = parse_line(qr{\s+}, 0, $_);
print "$_\n" for @words;
}
__DATA__
'stringA' '\"stringB\"' variableA variableB
输出:
stringA
\"stringB\"
variableA
variableB