如何替换字符串中的内部大写字母

How to replace an internal capital letter in a string

我的字符串范围如下:

vec<-c("Peronospora boniNhenrici","Cystoseira abiesNmarina","Niplommatina rubra",
 "Padina sanctaeNcrucis","Nachygrapsus NaurusNliguricus","Melphidippa borealis")

我想把每个元素的第二个单词中的内部大写 "N" 替换为“-”,这样它就像:

("Peronospora boni-henrici","Cystoseira abies-marina","Niplommatina rubra",
 "Padina sanctae-crucis,"Nachygrapsus Naurus-liguricus","Melphidippa borealis")

有什么建议吗?我使用以下方法获得了位置:

stri_locate_all(vec,regex = "[N]")

但我不确定如何替换 "N" 如果它是内部的。当我尝试使用 gsub 替换大写字母 "N" 时,它替换了所有出现的 N,而不仅仅是内部 "N".

我们可以查找任何被 \w 包围的 N,它在正则表达式中匹配任何字母数字字符或下划线。如果范围太广,您可以将 \w 替换为 [a-zA-Z] 以仅匹配字母:

stringr::str_replace_all(vec, "(\w)N(\w)", "\1-\2")

我们可以用look behind把单词中间的"N"换成"-"

gsub("(?<!^)\wN", "-", vec, perl = TRUE)

#[1] "Peronospora bon-henrici"  "Cystoseira abie-marina"  "Niplommatina rubra"
#[4] "Padina sancta-crucis" "Nachygrapsus Nauru-liguricus" "Melphidippa borealis"

我们可以将 gsub 与捕获组一起使用

gsub("([a-z])N([a-z])", "\1-\2", vec)
#[1] "Peronospora boni-henrici"  "Cystoseira abies-marina" "Niplommatina rubra"         
#[4] "Padina sanctae-crucis"       
#[5] "Nachygrapsus Naurus-liguricus" "Melphidippa borealis"

如果您的正则表达式风格支持 \B word boundaries (use gsub with perl=TRUE)

\BN\B

并替换为-。参见 this demo at Regex101