我知道有一些类似的问题,但它们对我没有帮助,可能是因为我缺乏对字符串操作基础知识的理解。
我有一根绳子,我想从它的第一个方括号内侧提取出来。
x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"
我已经在互联网上查看了以下代码,但它给了我第二个括号内
sub(".*\[(.*)\].*", "\1", x, perl=TRUE)
代码返回2。我预计得到4。
如果有人指出缺失的部分,将不胜感激。
----更新----
在前两个实例中将.*
替换为.*?
有效,但不知道如何。我将这个问题留给可以提供为什么有效的人:
sub(".*?\[(.*?)\].*", "\1", x, perl=TRUE)
你快到了:
sub("^[^\]]*\[(\d+)\].*", "\1", x, perl=TRUE)
## [1] "4"
最初的问题是.*
在匹配之前尽可能多地匹配任何东西[
.您的解决方案是*?
这是*
(不贪婪,不情愿(匹配的懒惰版本,尽可能少。
完全有效,我使用的另一种选择是[^\]]*
:它将任何不]
的东西转换为匹配。
stringr
您可以使用基本 R 解决此问题,但在处理此类"问题"时,我通常更喜欢stringr
包中的函数。
x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"
如果只想使用括号之间的第一个字符串,请使用str_extract
:
stringr::str_extract(x, "(?<=\[).+?(?=\])")
# [1] "4"
如果要将所有字符串都放在括号之间,请使用str_extract_all
:
stringr::str_extract_all(x, "(?<=\[).+?(?=\])")
# [[1]]
# [1] "4" "2"