我对regex还比较陌生,所以如果问题很琐碎,请耐心等待。我想用正则表达式在字符串的每个字母之间加一个逗号,例如:
x <- "ABCD"
我想要
"A,B,C,D"
如果我可以使用gsub
、sub
或相关的任意数量字符的字符串向量来实现这一点,那就太好了。
我试过
> sub("(\w)", "\1,", x)
[1] "A,BCD"
> gsub("(\w)", "\1,", x)
[1] "A,B,C,D,"
> gsub("(\w)(\w{1})$", "\1,\2", x)
[1] "ABC,D"
尝试:
x <- 'ABCD'
gsub('\B', ',', x, perl = T)
打印:
[1] "A,B,C,D"
可能误解了查询;OP希望仅在字母之间添加逗号。尝试:
gsub('(\p{L})(?=\p{L})', '\1,', x, perl = T)
(p{L})
-匹配第一组中任何语言的任何类型的字母(?=p{L})
-正前瞻性匹配,如上所述
我们可以在替换中使用对此捕获组的反向引用。
您可以使用
> gsub("(.)(?=.)", "\1,", x, perl=TRUE)
[1] "A,B,C,D"
(.)(?=.)
正则表达式匹配将其捕获到组1中的任何字符(使用(.)
(,该组必须后跟任何单个字符((?=.)
(是一个正向前瞻,需要在当前位置的右侧立即添加一个字符(。
解决方案的Vratings:
> gsub("(.)(?!$)", "\1,", x, perl=TRUE)
## Or with stringr:
## stringr::str_replace_all(x, "(.)(?!$)", "\1,")
[1] "A,B,C,D"
这里,如果存在字符串末尾位置,则(?!$)
不匹配。
在线查看R演示:
x <- "ABCD"
gsub("(.)(?=.)", "\1,", x, perl=TRUE)
# => [1] "A,B,C,D"
gsub("(.)(?!$)", "\1,", x, perl=TRUE)
# => [1] "A,B,C,D"
stringr::str_replace_all(x, "(.)(?!$)", "\1,")
# => [1] "A,B,C,D"
非正则表达式友好的答案:
paste(strsplit(x, "")[[1]], collapse = ",")
#[1] "A,B,C,D"
另一个选项是使用正向向后看和向前看来断言存在前一个和后一个字符:
library(stringr)
str_replace_all(x, "(?<=.)(?=.)", ",")
[1] "A,B,C,D"