Регулярное выражение в основном нормально, за исключением того, что оно не обрабатывает экранированные кавычки (то есть \"
и \'
). Это достаточно легко исправить:
'(?:\\.|[^'\\]+)*'|"(?:\\.|[^"\\]+)*"
Это "универсальное" регулярное выражение; в Python вы обычно пишете это в виде необработанной строки:
r"""'(?:\\.|[^'\\]+)*'|"(?:\\.|[^"\\]+)*""""
В PHP вы должны избегать обратной косой черты, чтобы пройти через обработку строк PHP:
'~\'(?:\\\\.|[^\'\\\\]+)*\'|"(?:\\\\.|[^"\\\\]+)*"~s'
Большинство популярных в настоящее время языков имеют строковый тип, для которого требуется меньше экранирования, поддержку литералов регулярных выражений или оба. Вот как ваше регулярное выражение выглядело бы как дословная строка C #:
@"'(?:\\.|[^'\\]+)*'|""(?:\\.|[^""\\]+)*"""
Но, если оставить в стороне вопросы форматирования, само регулярное выражение должно работать с любым производным от Perl (и многими другими).
p.s .: Обратите внимание, как я добавил квантификатор +
к вашим классам персонажей. Ваша интуиция о сопоставлении одного символа за раз верна; добавление +
делает огромную разницу в производительности. Но не позволяйте этому обмануть вас; когда вы имеете дело с регулярными выражениями, интуиция чаще всего ошибается, чем нет. : /