Как указать повторяющийся шаблон в одной строке, используя `sub ()` вместо `gsub ()` в R - PullRequest
0 голосов
/ 26 марта 2019

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

## A string for which I want to replace `red` and `Red` with `RED`
x <- c("redflag flagred red and Red")

## This one works using `gsub()`
gsub("\\b(?:red|Red)\\b", "RED", x)
#[1] "redflag flagred RED and RED"

Но есть ли способ использовать sub() вместо?Следующее не работает.Он соответствует только первому вхождению и затем останавливается:

sub("\\b(?:red|Red)\\b", "RED", x)
#[1] "redflag flagred RED and Red"

При проверке фактического шаблона он должен совпадать: https://regex101.com/r/X7DSB0/1 Я предполагаю, что это как-то связано с "глобальным флагом"?

Я также пытался добавить + или {1,}, чтобы получить несколько совпадений, но это тоже не работает:

## using a `+` doesn't work either
sub("\\b(?:red|Red)+\\b", "RED", x)
#[1] "redflag flagred RED and Red"

## using `{1,}` doesn't work either
sub("\\b(?:red|Red){1,}\\b", "RED", x)
#[1] "redflag flagred RED and Red"

Что я не понимаю?Как я мог использовать sub() вместо gsub() для такой операции?

1 Ответ

3 голосов
/ 26 марта 2019

g в gsub означает «глобальный», что означает, что вы указываете механизму регулярных выражений применить подстановку ко всей строке. С другой стороны, sub просто выполняет первую замену, с которой сталкивается.

Таким образом, ответ на ваш вопрос заключается в том, что вы должны использовать gsub, если вы собираетесь сделать все возможные замены:

gsub("\\b(?:red|Red)\\b", "RED", x)

[1] "redflag flagred RED and RED"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...