Using Text::Balanced:
#!/usr/bin/perl -w
use strict;
use Text::Balanced "extract_delimited";
my @queries = (
qq(QUERY = "SOME QUERY WITH "" (DOUBLE QUOTES)" YEEHA),
qq(Johnson looked up and said "Pie is tasty!" People in Clarkstown
+ liked ""Pie"".),
qq("You sir are an ""A\$\@hole""!" The chipmunks were naturally sh
+ocked.),
qq("""No Way!""" """Way!""")
);
for (@queries) {
my ($extracted, $remainder, $prefix) = extract_delimited(
undef, # defaults to $_
'"', # Our chosen delimiter
'[^"]*', # Allow for text before the delimiter
'"'); # Escape delimiter when doubled
# Strip the delimiter since Text::Balanced leaves it in
$extracted =~ s/^\"(.*)\"$/$1/;
print;
print "\n\$prefix = '$prefix'\n";
print "\$extracted = '$extracted'\n";
print "\$remainder = '$remainder'\n\n";
}
RETURNS:
QUERY = "SOME QUERY WITH "" (DOUBLE QUOTES)" YEEHA
$prefix = 'QUERY = '
$extracted = 'SOME QUERY WITH "" (DOUBLE QUOTES)'
$remainder = ' YEEHA'
Johnson looked up and said "Pie is tasty!" People in Clarkstown liked
+""Pie"".
$prefix = 'Johnson looked up and said '
$extracted = 'Pie is tasty!'
$remainder = ' People in Clarkstown liked ""Pie"".'
"You sir are an ""A$@hole""!" The chipmunks were naturally shocked.
$prefix = ''
$extracted = 'You sir are an ""A$@hole""!'
$remainder = ' The chipmunks were naturally shocked.'
"""No Way!""" """Way!"""
$prefix = ''
$extracted = '""No Way!""'
$remainder = ' """Way!"""'
mixing double delimiters