如何在第一次出现模式

时间:2016-10-18 16:55:12

标签: r regex stringr

我尝试使用R中的stringr包从字符串中提取所有内容,直到第一次出现下划线。

我尝试了什么

str_extract("L0_123_abc", ".+?(?<=_)")
> "L0_"

关闭但没有雪茄。我怎么得到这个?另外,理想情况下,我喜欢易于扩展的内容,这样我就可以在第一个和第二个下划线之间获取信息,并在第三个下划线之后获取信息。

4 个答案:

答案 0 :(得分:19)

要获得L0,您可以使用

> library(stringr)
> str_extract("L0_123_abc", "[^_]+")
[1] "L0"

[^_]+匹配_以外的1个或多个字符。

此外,您可以使用_分割字符串:

x <- str_split("L0_123_abc", fixed("_"))
> x
[[1]]
[1] "L0"  "123" "abc"

这样,您将获得所需的所有子字符串。

可以实现同样的目标
> str_extract_all("L0_123_abc", "[^_]+")
[[1]]
[1] "L0"  "123" "abc"

答案 1 :(得分:3)

The regex lookaround should be

str_extract("L0_123_abc", ".+?(?=_)")
#[1] "L0"

答案 2 :(得分:1)

使用gsub ...

gsub("(.+?)(\\_.*)", "\\1", "L0_123_abc")

答案 3 :(得分:1)

您可以使用sub base 中使用_.*,从_开始使用所有内容。

sub("_.*", "", "L0_123_abc")
#[1] "L0"

或者使用[^_]代表一切,而不是_

sub("([^_]*).*", "\\1", "L0_123_abc")
#[1] "L0"

或将substrregexpr一起使用。

substr("L0_123_abc", 1, regexpr("_", "L0_123_abc")-1)
#substr("L0_123_abc", 1, regexpr("_", "L0_123_abc", fixed=TRUE)-1) #More performant alternative
#[1] "L0"