我知道有很多答案显示如何匹配单个字符串中的多个匹配项。但是,我还找不到能够提供有关为什么以下内容不起作用的上下文的答案:
## 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()
进行这种操作?
答案 0 :(得分:3)
g
中的gsub
代表“全局”,这意味着您要告诉正则表达式引擎将替换应用于整个字符串。另一方面,sub
只是遇到它的第一个替换项。
因此,您的问题的答案是,如果您打算进行所有可能的替换,则应使用gsub
:
gsub("\\b(?:red|Red)\\b", "RED", x)
[1] "redflag flagred RED and RED"