Вот некоторые решения.
В этом вопросе запятая в квадратных скобках всегда сопровождается пробелом, и я предположил, что это общий случай, но если запятая в квадратных скобках может следовать без пробел, затем удалите пробел после запятой в шаблоне в каждом решении.
1) gsubfn Этот однострочник использует gsubfn
, который находит соответствия шаблону, указанному в первом аргументе , передает его функции (которая может быть указана в виде формулы) во втором аргументе и заменяет каждое совпадение выводом функции.
Здесь он соответствует tag:[
, за которым следует строка до следующего ближайшего ]
и использует gsub
для выполнения требуемой замены в этом.
library(gsubfn)
gsubfn("tag:\\[.*?\\]", ~ gsub(", ", "]+[", x), Lines)
2) gsub Это можно сделать за один gsub
, хотя обратите внимание на предостережение ниже. Он ищет запятую, за которой следует пробел, за которым следует любое количество не квадратных скобок, за которыми следует правая квадратная скобка. Если левая квадратная скобка стоит первой или правая квадратная скобка не встречается, она не будет совпадать. Все, кроме запятой, находится в пределах просмотра с нулевой шириной - просмотр не будет рассматриваться как часть шаблона, поэтому заменяется только пространство запятых, а часть просмотра продолжает обрабатываться для получения дополнительных последовательностей запятых и пробелов.
(К сожалению, lookbehind не поддерживает повторяющиеся символы, поэтому мы не можем использовать ту же идею для проверки предшествующего tag:[
. Таким образом, это не совсем безопасно, хотя проверок, которые действительно кажутся достаточными для примера ввода в вопросе и, возможно, для вашего фактического ввода.)
Используется только база R.
gsub(", (?=[^][]*\\])", "]+[", Lines, perl = TRUE)
2a) Эта вариация (2) длиннее чем (2), но он проверяет tag:[
и все еще использует только основание R. Предполагается, что на входе нет скобок. Если в скобках есть скобки, используйте другие символы, которых нет во вводе, например, <и>. Сначала он заменяет tag:[...]
на {...}
. Затем он выполняет подстановку, как в (2), но с использованием скобок, и, наконец, преобразует обратно.
Lines2 <- gsub("tag:\\[(.*?)\\]", "{\\1}", Lines)
Lines3 <- gsub(", (?=[^][{}]*})", "]+[", Lines, perl = TRUE)
gsub("\\{(.*?)\\}", "tag:[\\1]", Lines2)