每5个字符拆分一个字符串

34

假设我有一个很长的字符串:

"XOVEWVJIEWNIGOIWENVOIWEWVWEW"

我该怎样拆分这个字符串,才能每5个字符后面跟一个空格?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW"
注意最后一个字符串更短。 我可以使用循环进行计数并逐个构建新字符串,但肯定有更好的方法,对吗?

4
请查看此问题:https://dev59.com/VXE95IYBdhLWcg3wlu4g - n8sty
这个回答解决了你的问题吗?将字符串切割成固定宽度字符元素的向量 - tjebo
5个回答

63

使用正则表达式:

gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"

1
@flodel,你能帮忙解释一下“\1”吗?我已经弄清楚其他所有内容了,但这个让我困扰。 - user1357015
1
@user1357015,我认为hwnd在这里很好地解释了这个想法:https://dev59.com/DoTba4cB1Zd3GeqP6npA#26495062 - Tyler Rinker
这太棒了,而且速度超快 :) - Brian D
如何反转这个字符串呢?例如,如果从右到左开始,你会怎么做?另外,如果不是按照每5个字符分割,而是想要将前8个字符和后6个字符分开,该怎么办呢?最终的结果应该是这样的:"XOVEWVJI EWNIGOIWENVOIW EWVWEW" - Lasarus9

16

使用 sapply

> string <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
> sapply(seq(from=1, to=nchar(string), by=5), function(i) substr(string, i, i+4))
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"  

10

没有*apply的stringi解决方案:

x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
stri_sub(x, seq(1, stri_length(x),by=5), length=5)
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW" 

这个函数可以像 @Jilber 回答中一样提取子字符串,但是 stri_sub 函数是向量化的,所以我们不需要在这里使用 * apply。

9
你可以尝试以下方式:
s <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" # Original string
l <- seq(from=5, to=nchar(s), by=5) # Calculate the location where to chop

# Add sentinels 0 (beginning of string) and nchar(s) (end of string)
# and take substrings. (Thanks to @flodel for the condense expression)
mapply(substr, list(s), c(0, l) + 1, c(l, nchar(s))) 

输出:

[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"

现在您可以使用collapse=' '将结果向量粘贴,以获得带有空格的单个字符串。

2
应该是粘贴并折叠的,我想。 - rawr
这看起来很不错,我可以从这里粘贴和折叠。但是您介绍一下那个mapply是如何工作的吗?谢谢! - user1357015
@user1357015 添加了一些注释。 - musically_ut

6
您也可以使用不带循环的子字符串。 substring 是矢量化的 substr
x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
n <- seq(1, nc <- nchar(x), by = 5) 
paste(substring(x, n, c(n[-1]-1, nc)), collapse = " ")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"

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