Вот мое решение с тестовыми примерами:
/.*?'((?:\\\\|\\'|[^'])*+)'/
И мое (Perl, но я не использую никаких специфических для Perl функций, я не думаю) доказательство:
use strict;
use warnings;
my %tests = ();
$tests{'Case 1'} = <<'EOF';
$var = 'My string';
EOF
$tests{'Case 2'} = <<'EOF';
$var = 'My string has it\'s challenges';
EOF
$tests{'Case 3'} = <<'EOF';
$var = 'My string ends with a backslash\\';
EOF
foreach my $key (sort (keys %tests)) {
print "$key...\n";
if ($tests{$key} =~ m/.*?'((?:\\\\|\\'|[^'])*+)'/) {
print " ... '$1'\n";
} else {
print " ... NO MATCH\n";
}
}
Запуск этого шоу:
$ perl a.pl
Case 1...
... 'My string'
Case 2...
... 'My string has it\'s challenges'
Case 3...
... 'My string ends with a backslash\\'
Обратите внимание, что начальный шаблон в начале должен быть не жадным. Затем я использую несоответствующие совпадения, чтобы сожрать \\ и \ ', а затем все, что не является отдельным символом кавычки.
Я думаю, что этот, вероятно, имитирует встроенный подход компилятора, что должно сделать его довольно пуленепробиваемым.