我希望在"
:
my $a = 'echo "this is John."; # ok ';
$a =~ /"([^"]*)"/;
print $1;
这样可行,但它无法处理内部带有\"
的字符串:
my $a = 'echo "this is \"John\"."; # ok ';
# How to print: this is \"John\".
如何在"
而不是\"
之间获取字符串?
答案 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 =~ /(?<!\\)"(.*?)(?<!\\)"/;
或
/(?<!\\)(?:\\\\)*".*?(?<!\\)(?:\\\\)*"/;
或
/(?<!\\)(?:\\\\)*"(?:\\\\|\\"|[^\\"])*"/;
(?<!\\)"
只有在不带反斜杠字符的情况下才会匹配双引号。
答案 2 :(得分:1)
关键是匹配转义序列或非特殊字符:my $a = 'echo "this is John."; # ok ';
$a =~ /^ (?:\\.|[^\\"])* " ( (?:\\.|[^\\"])* ) "/xs;
print $1;
总之,我们得到:
{{1}}
答案 3 :(得分:0)
答案 4 :(得分:0)
您还可以使用以下内容:
$ a =〜/。?“(。?。)”/;