提取第一个方括号内

时间:2018-08-29 02:51:56

标签: r regex gsub stringr

我知道有几个类似的问题,但是它们可能对我没有帮助,可能是由于我对字符串操作的基本知识缺乏了解。

我有一段想提取其第一个方括号内部的字符串。

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"

我在互联网上看了看下面的代码,但是它使我陷入了第二括号

sub(".*\\[(.*)\\].*", "\\1", x, perl=TRUE)

代码返回 2 。我希望得到 4

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

----更新----

在前两个实例中将.*替换为.*?,但不知道如何。我对可以提供此功能的人开放一个问题:

sub(".*?\\[(.*?)\\].*", "\\1", x, perl=TRUE)

2 个答案:

答案 0 :(得分:1)

您快到了:

sub("^[^\\]]*\\[(\\d+)\\].*", "\\1", x, perl=TRUE)
## [1] "4"

最初的问题是.*在匹配[之前会尽可能匹配任何东西。您的解决方案是*?,它是*的一种懒惰版本(非贪婪,不情愿),它的匹配尽可能少。

完全有效,我使用的另一种替代方法是[^\\]]*:它将匹配]以外的任何内容。

答案 1 :(得分:0)

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"