缺少 gsub 在两个逗号之间添加字符串

gsub is missing to add string between two commas

我有以下字符串:

a <- "2015,,,,6GR,09,PRIVATE,NP,001"

我想在每个逗号之间添加 "YES"。所以我想要以下输出:

"2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"

我尝试了以下行:

gsub("([,])([,])", "\1YES\2", a)

但我的输出是:

"2015,YES,,YES,6GR,09,PRIVATE,NP,001"

有人能告诉我为什么 gsub 中间缺少两个逗号吗?我该如何解决这个问题?

我会尝试用不同的方式为您解决,而不是尝试回答您的问题,我不能回答您的问题。

就去做吧:

a= unlist(strsplit(a,","))
a[a==""]="YES"
a=paste(a,collapse=",")

你可以使用正 look-ahead :

gsub(",(?=,)",",YES",a,perl=TRUE)
# [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"

或者正数 look-behind :

gsub("(?<=,),","YES,",a,perl=TRUE)
# [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"

你的方法的问题是你的正则表达式 "consumes" 前两个连续的逗号并认为匹配,然后继续下一个连续的两个逗号,错过了中间的匹配。

相反,look-ahead 和 look-behind 部分(即 (?=,)(?<=,))中的字符实际上不是正则表达式的 "consumed",因此它有效。

perl=TRUE 启用支持 look-around 功能的 regular-expression 风格。

问题是在匹配,,之后第二个逗号不是re-scanned。在 "\B" 匹配 non-word-boundary 的地方试试这个,以避免必须匹配第二个逗号。只要您没有以 non-word 字符开头的字段(例如 "A,,,;B"),这就应该有效。它也不适用于第一个和最后一个字段,但问题中的表达式对这些字段也不起作用,因此我们假设这不是问题。

gsub(",\B", ",YES", a)
## [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"