基于大写字母拆分字符串

3

如何根据字符串中包含的每个大写字母拆分字符串。在互联网上找不到任何帮助。

a<-"MiXeD"
b<-"ServiceEventId"

I would like to get

a<-c("Mi", "Xe", "D")
b<-c("Service", "Event", "Id")

请参考以下选项(特别是第二个答案的评论):https://dev59.com/FGsz5IYBdhLWcg3wTl-r - 奇怪的是,这是在搜索“R Split a string based on upper case letters”时谷歌的第一个结果,而这实际上是你的问题标题。嗯? - thelatemail
请参见:https://dev59.com/J33aa4cB1Zd3GeqPiNDz - G. Grothendieck
@thelatemail 可能值得强调的是(即使我知道知道),那里的两个答案都没有做到这里OP所要求的。(正如您所示,我的评论——在Ben Bolker的答案下面的第三个——才是。) - Josh O'Brien
@thelatemail,您引用的是与我参考的不同的SO帖子。 - G. Grothendieck
2个回答

2

这里有一种选项,使用一个向后断言和一个向前断言来查找(然后在其处分割)紧随大写字母的字符间空格。要了解为什么需要同时使用向前和向后断言(而不仅仅是向前断言),请参阅此问题及其答案

f <- function(x) {
    strsplit(x, "(?<=.)(?=[[:upper:]])", perl=TRUE)
}

f(a)
# [[1]]
# [1] "Mi" "Xe" "D" 

f(b)
# [[1]]
# [1] "Service" "Event"   "Id"  

1
仅供娱乐,这是一个 regmatches 改编版 - regmatches(d,gregexpr("([[:upper:]]|^)([^[:upper:]]+|$)",d)) - thelatemail

2
使用stringr包中的str_extract_all函数:
library(stringr)
str_extract_all(x, "[A-Z][a-z]*")

或者

str_extract_all(x, "[A-Z][a-z]*|[a-z]+")

我认为如果字符串以小写字母或其他字符开头,它就会出错 - 例如:"thisIsMixed"。 - thelatemail
str_extract_all(x, "[A-Z][a-z]*|[a-z]+") - Avinash Raj

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