Регулярное выражение для замены запятых только в квадратных скобках - PullRequest
1 голос
/ 26 июня 2019

У меня есть текстовый файл, и он содержит строки, разделенные запятыми.Но некоторые строки, разделенные запятыми, имеют вид [*,*,*,...].Так, например:

«Привет», «До свидания», [«Да», «Нет», «Может быть», «Действительно», [«Почему», «Что»]

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

Я пытался использовать этот код в R, ноон не работает, как запланировано, некоторые запятые за пределами моих скобок заменяются:

repeat{
          tmp <- gsub("(\\[.*\\K),(?=.*\\])", ";", tmp, perl = TRUE) # replace last comma found within braces with semicolon
          if (sum(grepl("(\\[.*\\K),(?=.*\\])", tmp, perl = TRUE)) == 0) {  # repeat until no more commas found
            break
          }
        }

Может кто-нибудь помочь с регулярным выражением, которое может решить эту проблему? Спасибо!

1 Ответ

4 голосов
/ 26 июня 2019

Чтобы заменить все запятые в квадратных скобках на точки с запятой, вы можете использовать

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

См. regex demo .Приведенное выше регулярное выражение не проверяет закрытие ].Если требуется, используйте

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

См. еще одну демонстрацию регулярных выражений

Подробности

  • (?:\G(?!^)|\[)- конец предыдущего матча (\G(?!^)) или (|) a [ (\[)
  • [^][,]* - 0+ символов, отличных от [ и ], и a]
  • \K - оператор сброса совпадений, который отбрасывает весь сопоставленный текст
  • , - запятая
  • (?=[^][]*]) - положительный прогноз, которыйтребуется 0+ символов кроме [ и ] и ] сразу справа от текущего местоположения.
...