正则表达式在任何字符之间添加逗号。

3

我对正则表达式比较新,所以如果问题很简单,请见谅。我想使用正则表达式在每个字符串字母之间放置逗号,例如:

x <- "ABCD"

我想获取

"A,B,C,D"

希望我能够使用gsubsub或相关函数在任意长度的字符串向量上执行此操作。

我尝试过:

> 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"

trimws(gsub("", ",", x),,",") - Onyambu
1
@Tom,我在我的编辑中将“冒号”改为了“逗号”。 - bobble bubble
4个回答

6

尝试:

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}) - 正向先行断言,按上述匹配。

我们可以在替换中使用对这个捕获组的反向引用。


1
啊,没错:‘\B’ 匹配空字符串,只要它不在单词边缘处;另一个有用的符号。 - Tom
@Tom,我还有一个后续问题。您是否希望在所有字符之间添加逗号?包括逗号本身吗?例如,对于Hello,12&4,您想要的输出是什么?虽然\B适用于当前示例数据,但可能会导致意外结果。 - JvdV
呵呵,不错。但是,在这种情况下不行。 - Tom
1
@Tom,是的。请参考这个列表。 - JvdV
1
不错,我认为这是迄今为止最合适的答案,尤其是第二部分。 - bobble bubble
显示剩余2条评论

3
你可以使用
> gsub("(.)(?=.)", "\\1,", x, perl=TRUE)
[1] "A,B,C,D"
(.)(?=.) 正则表达式匹配任何字符并将其捕获到组1中(使用 (.)),该字符必须在当前位置的右侧紧跟着任何单个字符((?=.) 是一个正向先行断言,要求当前位置的右侧立即跟随一个字符)。

解决方案的变化:

> 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"

1
啊,谢谢!我以为是关于前瞻的问题,但我没能让它工作。还要感谢您的解释,这真的很有帮助。 - Tom

2
一种不适用正则表达式的解答:
paste(strsplit(x, "")[[1]], collapse = ",")
#[1] "A,B,C,D"

1
谢谢!我也想到了这个,但我真的需要磨练我的正则表达式技能。 - Tom

0
另一种选项是使用正向后顾和正向先行来断言有前导字符和后续字符:
library(stringr)
str_replace_all(x, "(?<=.)(?=.)", ",")
[1] "A,B,C,D"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接