匹配除引号内字符以外的所有内容

时间:2014-09-24 04:20:16

标签: regex perl

经过一番游戏,我想出了一种在单/双引号中捕捉角色的方法:

['"](?:[^'"]*?(?:\\")*)*["']

不确定这是否完全正确。无论如何,我现在正试图匹配所有这些。

示例:

'stringA' '\"stringB\"' variableA variableB

上述正则表达式匹配:'stringA' '\"stringB\"'

我想与variableA variableB

相匹配

有没有办法可以用Perl实现这个目标?我试图使用negative/positive lookahead/behinds,但我遇到了问题,因为lookbehind \s* {{1}}是不允许的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用PCRE动词(*SKIP)(*F)

['"](?:[^'"]*?(?:\\")*)*["'](*SKIP)(*F)|\S+

DEMO

  • ['"](?:[^'"]*?(?:\\")*)*["']匹配双引号或单引号中的字符串。
  • (*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