如何在R中使用`sub()`而不是`gsub()`在一个字符串中指定重复模式

时间:2019-03-26 04:44:05

标签: r regex

我知道有很多答案显示如何匹配单个字符串中的多个匹配项。但是,我还找不到能够提供有关为什么以下内容不起作用的上下文的答案:

## 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 个答案:

答案 0 :(得分:3)

g中的gsub代表“全局”,这意味着您要告诉正则表达式引擎将替换应用于整个字符串。另一方面,sub只是遇到它的第一个替换项。

因此,您的问题的答案是,如果您打算进行所有可能的替换,则应使用gsub

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

[1] "redflag flagred RED and RED"