Как ни странно, ни один из этих ответов не создает регулярное выражение, где возвращаемое совпадение является текстом внутри кавычек, что и требуется. MA-Madden пытается, но получает только внутренний матч как захваченную группу, а не весь матч. Один из способов сделать это:
(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)
Примеры для этого можно увидеть в этом демо https://regex101.com/r/Hbj8aP/1
Ключевым моментом здесь является положительный lookbehind в начале (?<=
) и положительный результат в конце (?=
). Lookbehind смотрит за текущим персонажем, чтобы проверить цитату, если она будет найдена, тогда начните оттуда, а затем lookahead проверит символ впереди для цитаты и, если будет найден, остановится на этом символе. Группа lookbehind (["']
) заключена в скобки, чтобы создать группу для какой-либо цитаты, найденной в начале, затем она используется в конце lookahead (?=\1)
, чтобы убедиться, что она останавливается только тогда, когда находит соответствующую цитату.
Единственное другое осложнение состоит в том, что, поскольку lookahead на самом деле не потребляет конечную цитату, он будет снова найден с помощью начального lookbehind, который вызывает соответствие текста между конечными и стартовыми кавычками в одной и той же строке. Помещение границы слова на открытии цитаты (["']\b
) помогает с этим, хотя в идеале я бы хотел пройти мимо взгляда, но я не думаю, что это возможно. Бит, позволяющий экранированным символам посередине, я взял непосредственно из ответа Адама.