我知道有几个类似的问题,但是它们可能对我没有帮助,可能是由于我对字符串操作的基本知识缺乏了解。
我有一段想提取其第一个方括号内部的字符串。
x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"
我在互联网上看了看下面的代码,但是它使我陷入了第二括号
sub(".*\\[(.*)\\].*", "\\1", x, perl=TRUE)
代码返回 2 。我希望得到 4 。
如果有人指出丢失的部分,将不胜感激。
----更新----
在前两个实例中将.*
替换为.*?
,但不知道如何。我对可以提供此功能的人开放一个问题:
sub(".*?\\[(.*?)\\].*", "\\1", x, perl=TRUE)
答案 0 :(得分:1)
您快到了:
sub("^[^\\]]*\\[(\\d+)\\].*", "\\1", x, perl=TRUE)
## [1] "4"
最初的问题是.*
在匹配[
之前会尽可能匹配任何东西。您的解决方案是*?
,它是*
的一种懒惰版本(非贪婪,不情愿),它的匹配尽可能少。
完全有效,我使用的另一种替代方法是[^\\]]*
:它将匹配]
以外的任何内容。
答案 1 :(得分:0)
您可以使用基数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"