perl匹配这个但不是那个模式

时间:2015-09-26 11:04:53

标签: regex perl

我希望在"

之间添加字符串
my $a = 'echo "this is John."; # ok ';
$a =~ /"([^"]*)"/;
print $1;

这样可行,但它无法处理内部带有\"的字符串:

my $a = 'echo "this is \"John\"."; # ok ';

# How to print: this is \"John\".

如何在"而不是\"之间获取字符串?

5 个答案:

答案 0 :(得分:2)

当您想忽略嵌入式引号时,Text::ParseWords - Perl 5中的核心模块 - 提供了一种简单的方法来处理它:

use strict;
use warnings;
use Data::Dumper;
use Text::ParseWords;

my $s = 'echo "this is \"John\"."; # ok ';
my @x = grep { defined and /^"/ } quotewords(" ", 1, $s);
print Dumper \@x;

请注意,您应该避免使用$a$b,因为它们是由sort函数保留的。

在这段代码中,我简单地在空格上拆分,并询问引用的字段是否完整。由于我们只对引用的字符串感兴趣,因此我使用grep删除其余字符串。

答案 1 :(得分:1)

如下所示更改正则表达式。

$a =~ /(?<!\\)"(.*?)(?<!\\)"/;

/(?<!\\)(?:\\\\)*".*?(?<!\\)(?:\\\\)*"/;

/(?<!\\)(?:\\\\)*"(?:\\\\|\\"|[^\\"])*"/;

DEMODEMO 2

(?<!\\)"只有在不带反斜杠字符的情况下才会匹配双引号。

答案 2 :(得分:1)

关键是匹配转义序列或非特殊字符:my $a = 'echo "this is John."; # ok '; $a =~ /^ (?:\\.|[^\\"])* " ( (?:\\.|[^\\"])* ) "/xs; print $1;

总之,我们得到:

{{1}}

答案 3 :(得分:0)

([^"]*): 无法捕获\",因为模式意味着

  

捕获任何非"的内容。

因此,为了使其成功,您可以使用""匹配"(.*)"中的所有内容。然后捕获group 1

请参阅DEMO

答案 4 :(得分:0)

您还可以使用以下内容:

$ a =〜/。?“(。?。)”/;