R 提取第一个方括号内的内容

R 提取第一个方括号内的内容,r,regex,gsub,stringr,R,Regex,Gsub,Stringr,我知道有一些类似的问题,但它们对我没有帮助,可能是因为我对字符串操作的基础知识缺乏理解 我有一根绳子,我想从它的第一个方括号里取出 x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5" 代码返回2。我希望得到4分 如果有人指出丢失的部分,我将不胜感激 --更新-- 将.*替换为.*?在前两种情况下都有效,但不知道如何。我将这个问题留给那些能够解释为什么这样做的人: sub(".*?\\[(.*?)\\].*", "\\1", x, perl=TRU

我知道有一些类似的问题,但它们对我没有帮助,可能是因为我对字符串操作的基础知识缺乏理解

我有一根绳子,我想从它的第一个方括号里取出

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"
代码返回2。我希望得到4分

如果有人指出丢失的部分,我将不胜感激

--更新--

将.*替换为.*?在前两种情况下都有效,但不知道如何。我将这个问题留给那些能够解释为什么这样做的人:

sub(".*?\\[(.*?)\\].*", "\\1", x, perl=TRUE)
斯特林格 您可以使用base R解决这个问题,但在处理此类“问题”时,我通常更喜欢stringr包中的函数

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"
如果需要括号之间的所有字符串,请使用str\u extract\u all:

你就快到了:

sub("^[^\\]]*\\[(\\d+)\\].*", "\\1", x, perl=TRUE)
## [1] "4"
最初的问题是。*在匹配之前匹配尽可能多的内容[。您的解决方案是*?,这是*的懒惰版本,不贪婪,不情愿地尽可能少地匹配


完全有效,我使用的另一个替代方法是[^\\]]*:它转换为匹配任何不匹配的内容]。

在使用此处接受的答案后,您可以将第一个值子集?sub.\\\[.\\].\\1,x似乎按照@Ronaksah建议的链接工作。谢谢@zacdav,这部分帮助。我把第二个.*改成了.*?这很有效,但我不知道怎么做。谢谢Ronak的推荐,但我找不到帮助there@msd\[\d?:.*这匹配第一个“4”。*?之所以有效,是因为它是一个懒惰的*。也就是说,您匹配0到N次,并预递尽可能短的匹配,而不是预递尽可能长的匹配的常规*
stringr::str_extract(x, "(?<=\\[).+?(?=\\])")
# [1] "4"
stringr::str_extract_all(x, "(?<=\\[).+?(?=\\])")
# [[1]]
# [1] "4" "2" 
sub("^[^\\]]*\\[(\\d+)\\].*", "\\1", x, perl=TRUE)
## [1] "4"