Вместо:
(\'[^\']*\'|"[^"]*")
Просто напишите:
\'([^\']*)\'|"([^"]*)"
\______/ \_____/
1 2
Теперь одна из групп будет соответствовать цитируемому содержимому.
В большинстве случаев, когдагруппа, которой не удалось найти, упоминается в строке замены, в нее подставляется пустая строка, поэтому вы можете просто заменить на $1$2
, и одна будет успешным захватом (в зависимости от альтернативы), а другая будет заменена пустойstring.
Вот реализация PHP (, как видно на ideone.com ):
$text = <<<EOT
"hello", how 'are "you" today'
EOT;
print preg_replace(
'/\'([^\']*)\'|"([^"]*)"/',
'$1$2',
$text
);
# hello, how are "you" today
Более внимательный взгляд
Давайте использовать1
и 2
для кавычек (для наглядности).Также будут добавлены пробелы (для ясности).
Ранее у вас в качестве второго решения был следующий шаблон:
( 1[^1]*1 | 2[^2]*2 )
\_______________________/
capture whole thing
content and quotes
Как вы правильно указали, это соответствует паре кавычекправильно (при условии, что вы не можете избежать кавычек), но он не захватывает часть content .
Это не может быть проблемой в зависимости от контекста (например, вы можете просто обрезать однусимвол от начала и до конца, чтобы получить контент), но в то же время, это не так сложно, чтобы решить проблему: просто захватить контент из двух возможностей по отдельности.
1([^1]*)1 | 2([^2]*)2
\_____/ \_____/
capture contents from
each alternate separately
Теперь либо группа1 или группа 2 будет захватывать содержимое в зависимости от того, какой альтернативный вариант был найден.В качестве «бонуса» вы можете проверить, какая цитата использовалась, т. Е. Если группа 1 преуспела, то была использована 1
.
Приложение
[…]
- это класс символов .Нечто вроде [aeiou]
соответствует одному из строчных гласных.[^…]
- это отрицательный класс символов.[^aeiou]
соответствует одному из всего, кроме строчных гласных.
(…)
используется для группировки .(pattern)
является группой захвата и создает обратную ссылку.(?:pattern)
не захватывает.
Список литературы