R RegEx: сопоставить все двойные кавычки (") в квадратных скобках - PullRequest
1 голос
/ 30 октября 2019

Я изо всех сил пытаюсь получить выражение RegEx, которое соответствует всем символам в двойных кавычках ("), которые встречаются в квадратных скобках.

У меня есть разные части, которые делают части того, что я хочу. Например,

gsub('"', "", '"""xyz"""')
[1] "xyz"

Получит все двойные кавычки, независимо от чего-либо еще.

gsub('\\[(.*?)\\]', "", '[xyz][][][]abc')
[1] "abc"

Получит все в двух квадратных скобках, включая сами скобки (, которыеЯ не хочу, чтобы это произошло - как мне этого избежать? ).

Я также не уверен, как объединить два, как только они у меня будут работать. Вот пример желаемого поведения. С учетом входной строки ["cats", "dogs"]"x" мне нужно выражение, которое заменит четыре " символа внутри квадратных скобок, но не те, что снаружи.

Точнее говоря:

gsub('THE_REGEX', "", '["cats", "dogs"]"x"')

должен вернуть

[cats, dogs]"x"

Я хочу удалить двойные кавычки, когда они встречаются внутри квадратных скобок, но не когда они заключены в квадратные скобки.

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Шаблон на основе \G обеспечивает непрерывность между совпадениями и то, что вы всегда находитесь в квадратных скобках:

gsub('(?:\\G(?!\\A)|\\[)[^]"]*\\K"', "", '["cats", "dogs"]"x"', perl=TRUE)

Или если вы хотите проверить, существует ли заключительная квадратная скобка:

gsub('(?:\\G(?!\\A)|\\[(?=[^][]*]))[^]"]*\\K"', "", '["cats", "dogs"]"x"', perl=TRUE)

Якорь \G соответствует последней позиции, достигнутой механизмом регулярных выражений, поэтому его можно использовать для обеспечения смежности между совпадениями.

Два шаблона начинаются с чередования. Одна ветвь используется для первого совпадения (второго) и находит открывающую квадратную скобку, затем [^]"]* достигает последнего символа, который не является кавычкой или закрывающей квадратной скобкой. \K отмечает позицию, из которой вы хотите, чтобы символы возвращались из результата совпадения (поэтому все, что предшествует, не стирается). Другая ветвь, которая начинается с \G, используется для следующих матчей (только сразу после предыдущего). Поскольку [^]"]* запрещает закрывающую квадратную скобку, вы не можете выйти из квадратных скобок. Когда больше нет кавычек для замены шаблона, происходит сбой, механизм регулярных выражений переходит к следующему символу и так далее, пока вторая ветвь не преуспеет снова (если найдена открывающая квадратная скобка).

Примечание: даже если этот путьне нуждается в зависимости, имейте в виду, что это (отнюдь) менее просто для понимания, чем применение функции обратного вызова для сопоставления всего содержимого в скобках, как это делает Grothendieck.


О программедва крайних случая в моем комментарии, я думаю, что лучшее решение - сохранить кавычки, которые содержат закрывающую квадратную скобку, когда они заключены в квадратные скобки: https://regex101.com/r/SOMpqN/1

2 голосов
/ 30 октября 2019

Используя gsubfn, найдите [...] и затем передайте каждое совпадение указанной функции gsub. Все, что находится за пределами матча, останется как есть.

library(gsubfn)

gsubfn('\\[.*?\\]', ~ gsub('"', '', x), s)
## [1] "\"abc\" [cats, dogs] \"def\"" "\"abc\" [cats, dogs] \"def\""

Примечание

Тестовые данные:

s <- '"abc" ["cats", "dogs"] "def"'
s <- c(s, s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...