首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在字符串中的特定位置插入字符

在字符串中的特定位置插入字符
EN

Stack Overflow用户
提问于 2012-12-13 23:57:45
回答 7查看 81.8K关注 0票数 67

我想在字符串中的特定位置插入一个额外的字符(或新字符串)。例如,我想在abcefg中的第四个位置插入d以获取abcdefg

现在我使用:

代码语言:javascript
运行
复制
old <- "abcefg"
n <- 4
paste(substr(old, 1, n-1), "d", substr(old, n, nchar(old)), sep = "")

我可以为这个任务编写一个一行的简单函数,但我只是好奇是否有一个现有的函数来完成这个任务。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-12-14 00:05:42

您可以使用正则表达式和gsub来做到这一点。

代码语言:javascript
运行
复制
gsub('^([a-z]{3})([a-z]+)$', '\\1d\\2', old)
# [1] "abcdefg"

如果要动态执行此操作,可以使用paste创建表达式

代码语言:javascript
运行
复制
letter <- 'd'
lhs <- paste0('^([a-z]{', n-1, '})([a-z]+)$')
rhs <- paste0('\\1', letter, '\\2')
gsub(lhs, rhs, old)
# [1] "abcdefg"

根据DWin的评论,您可能希望它更通用。

代码语言:javascript
运行
复制
gsub('^(.{3})(.*)$', '\\1d\\2', old)

这样,任何三个字符都将匹配,而不仅仅是小写。DWin还建议使用sub而不是gsub。这样你就不必担心^了,因为sub只会匹配第一个实例。但我喜欢在正则表达式中显式表达,并且只在我理解它们并发现需要更通用的表达式时才转到更通用的表达式。

正如Greg Snow所指出的,您可以使用另一种形式的正则表达式来查找匹配:

代码语言:javascript
运行
复制
sub( '(?<=.{3})', 'd', old, perl=TRUE )

我还可以使用sprintf而不是paste0构建上面的动态gsub

代码语言:javascript
运行
复制
lhs <- sprintf('^([a-z]{%d})([a-z]+)$', n-1) 

或者他的sub正则表达式:

代码语言:javascript
运行
复制
lhs <- sprintf('(?<=.{%d})',n-1)
票数 70
EN

Stack Overflow用户

发布于 2017-08-17 22:44:25

stringi包再次施救!在所提出的解决方案中,最简单和优雅的解决方案。

stri_sub函数允许您提取字符串的一部分,并像这样替换它的一部分:

代码语言:javascript
运行
复制
x <- "abcde"
stri_sub(x, 1, 3) # from first to third character
# [1] "abc"
stri_sub(x, 1, 3) <- 1 # substitute from first to third character
x
# [1] "1de"

但是如果你这样做:

代码语言:javascript
运行
复制
x <- "abcde"
stri_sub(x, 3, 2) # from 3 to 2 so... zero ?
# [1] ""
stri_sub(x, 3, 2) <- 1 # substitute from 3 to 2 ... hmm
x
# [1] "ab1cde"

则不会删除任何字符,但会插入新字符。这不是很酷吗?:)

票数 34
EN

Stack Overflow用户

发布于 2012-12-14 00:18:49

@Justin的答案是,由于它的灵活性,我实际上会采用这种方式,但this也可能是一种有趣的方法。

您可以将字符串视为“固定宽度格式”,并指定要插入字符的位置:

代码语言:javascript
运行
复制
paste(read.fwf(textConnection(old), 
               c(4, nchar(old)), as.is = TRUE), 
      collapse = "d")

尤其是在使用sapply时的输出,因为您可以看到原始字符串作为“名称”。

代码语言:javascript
运行
复制
newold <- c("some", "random", "words", "strung", "together")
sapply(newold, function(x) paste(read.fwf(textConnection(x), 
                                          c(4, nchar(x)), as.is = TRUE), 
                                 collapse = "-WEE-"))
#            some          random           words          strung        together 
#   "some-WEE-NA"   "rand-WEE-om"    "word-WEE-s"   "stru-WEE-ng" "toge-WEE-ther" 
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13863599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档