私はこれが好き:
perl -ne 'print "$_\n" foreach /"((?>[^"\\]|\\+[^"]|\\(?:\\\\)*")*)"/g;'
少し冗長ですが、最も単純な実装よりも、エスケープされた引用符とバックトラックをはるかにうまく処理します。それが言っていることは:
my $re = qr{
" # Begin it with literal quote
(
(?> # prevent backtracking once the alternation has been
# satisfied. It either agrees or it does not. This expression
# only needs one direction, or we fail out of the branch
[^"\\] # a character that is not a dquote or a backslash
| \\+ # OR if a backslash, then any number of backslashes followed by
[^"] # something that is not a quote
| \\ # OR again a backslash
(?>\\\\)* # followed by any number of *pairs* of backslashes (as units)
" # and a quote
)* # any number of *set* qualifying phrases
) # all batched up together
" # Ended by a literal quote
}x;
あなたがそれほど力を必要としないなら-それは対話であり、構造化された引用ではない可能性が高いと言ってください、そして
/"([^"]*)"/
おそらく他のものと同様に機能します。