我向上帝发誓我在过去60分钟搜索了整个互联网,谷歌搜索如“r get match”ecetera。我不想为这项简单的任务安装任何图书馆员。我有一个字符串"something1_something2"
,我希望得到something1
。
a<-"hi_there"
根据一些论坛条目,我应该用sub来获取它:
> sub("hi_", "\\1", a)
[1] "there"
我想获得"hi"
,但我似乎无法获得"hi_"
。我尝试了一千件事,我该怎么做?
答案 0 :(得分:3)
尝试 strsplit 将字符串分解为块:
x = c("hi_there", "this#is#sparta")
chunks = strsplit(x, c("_", "#"))
# first word
print(chunks[[1]])
[1] "hi" "there"
# second word
print(chunks[[2]])
[1] "this" "is" "sparta"
答案 1 :(得分:1)
这可能有点棘手。您需要在匹配整个字符串的模式中创建一个捕获组,以将整个字符串替换为捕获组中的内容:
sub("(hi)_.+","\\1",a)
[1] "hi"
答案 2 :(得分:1)
regexec
/ regmaches
也会这样做,尽管strsplit
方法对于这个特定问题更简单。
a <- c("hi_there", "something_somthing", "boo_ya_yo")
sapply(regmatches(a, regexec("^([^_]*)", a)), `[[`, 2)
# [1] "hi" "something" "boo"
这种方法的主要优点是,如果您有其他要求(例如,您还希望最左边的部分以辅音或其他形式开头),您可以通过修改正则表达式来解决这些问题。
答案 3 :(得分:1)
我猜你正在寻找从字符向量元素的开头到第一个下划线的子字符串。你只会找到一个匹配项(只有一个子字符串可以启动元素)所以sub
是要去的地方,要么匹配所需的字符串(请查看字符串^
捕获的开头零个或多个不是下划线([^_]*)
的字符,后跟下划线,可能还有其他字符_.*
)
re1 = "^([^_]*)_.*"
sub(re1, "\\1", x)
或删除第一个下划线后的内容(下划线_
后跟零个或多个任何其他字符.*
)
re2 = "_.*"
sub(re2, "", x)
进行一些测试
x = c("a_b", "a_", "_b", "a", "a_b_c", "", NA)
sub(re1, "\\1", x)
## [1] "a" "a" "" "a" "a" "" NA
sub(re2, "", x)
## [1] "a" "a" "" "a" "a" "" NA
strsplit
解决方案失败了。