R: gsub / заменяет только те вхождения, которые следуют за вхождением ключевого слова. - PullRequest
0 голосов
/ 25 октября 2019

Я хочу заменить только вхождения строк, которые следуют за определенным ключевым словом / шаблоном, а не раньше. другими словами, ничего не делайте до первого появления шаблона ключевого слова, а затем начинайте gsub справа от этого шаблона ключевого слова. См. Ниже:

gsub("\\[|\\]", "", "ab[ cd] ef keyword [ gh ]keyword ij ")

Фактические результаты: "ab cd ef keyword gh keyword ij"

Желаемые результаты: "ab [cd] [] [asfg]]] ef keyword gh keyword ij"

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

1 Ответ

1 голос
/ 25 октября 2019

Вы можете использовать \G для получения непрерывных совпадений после ключевого слова. Используйте \K, чтобы забыть, что было найдено, и сопоставьте следующее [ или ] для замены пустой строкой.

(?:^.*?keyword\b|\G(?!^))[^\[\]]*\K[\[\]]

По частям

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

Regex demo | R demo

Ваш код может выглядеть следующим образом:

gsub("(?:^.*?keyword\\b|\\G(?!^))[^\\[\\]]*\\K[\\[\\]]", "", "ab[ cd] ef keyword [ gh ]keyword ij ", perl=T)

Примечание для использования perl=T в конце для Perl-подобных регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...