如何优雅地给数字字符串添加破折号?

4

我有

a = c("1234567890", "0987654321")

and I want

a = c("123-456-789", "098-765-4321")

我想在字符串的第4个和第8个位置添加破折号,我该怎么做?

你需要更好地定义你想要的结果。什么规则会决定破折号放在哪里? - G5W
2
gsub('(.{3})(.{3})(.*)', '\1-\2-\3', a)。虽然使用正则表达式递归可能会更酷,但substrpaste也可以工作。 - alistaire
2
是的,或者 gsub("(...)(...)(.*)", "\\1-\\2-\\3", a) - Rich Scriven
我试图使用substr(),但无法弄清如何在不替换该位置的数字的情况下仅在该位置插入破折号... - user3697665
使用 substr 函数,可以这样写:paste(substr(a, 1, 3), substr(a, 4, 6), substr(a, 7, nchar(a)), sep = '-') - alistaire
1个回答

7

使用gsub(类似于评论中的一个方法):

gsub("(\\d{3})(\\d{3})(\\d{4})$","\\1-\\2-\\3",a)
[1] "123-456-7890" "098-765-4321"

或者使用 stringr 中的 str_replace

str_replace(a,"(\\d{3})(\\d{3})(\\d{4})$","\\1-\\2-\\3")

谢谢回答!有没有办法使用substr()函数? - user3697665
2
@user3697665 是的,有一种使用 substr 的方法。 - agstudy
@user3697665 - 你说你想要优雅。substr 不够优雅(也不够高效)。 - Rich Scriven
另一个使用回顾后发断言而非捕获组的 stringr 选项:str_replace_all(a, "(?<=^\\d{3}|^\\d{6})", "-") - Jota

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