如何在R中的两个字符之间提取值?

时间:2016-12-16 19:58:45

标签: r regex

我正在尝试使用正则表达式从R中的此字符串中提取服务器名称(server101):

@ 与以下第一个期间(。)

之间的值

t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com")

我试过这个:

gsub('.*\\@(\\d+),(\\d+).*', '\\1', t)

这似乎没有用,有什么想法吗?

2 个答案:

答案 0 :(得分:3)

由于您只需要一次匹配,因此您可以在此处使用简单的sub

t <- "Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com"
sub(".*@([^.]+)\\..*", "\\1", t)
##  => [1] "server101"

请参阅R demo online

<强>详情

  • .* - 任意0个字符,尽可能多
  • @ - @字符
  • ([^.]+) - 第1组("\\1"):
  • \\. - 一个点(您需要转义的其他字符包括$^*(),{ {1}},+[\
  • ? - 任意0个字符,尽可能多

以下是一些替代方案。

您可以使用以下基本R代码在第一个.*后提取.[^.]+)以外的1个以上字符:

@

使用> t <- "Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com" > pattern="@([^.]+)" > m <- regmatches(t,regexec(pattern,t)) > result = unlist(m)[2] > result [1] "server101" ,您可以访问子匹配(捕获组内容)。

请参阅online R demo

另一种方法是将regexec / regmatches与PCRE正则表达式一起使用regexpr lookbehind只检查字符存在,但不将字符放入匹配中:< / p>

(?<=@)

干净的 stringr 方法是使用与> result2 <- regmatches(t, regexpr("(?<=@)[^.]+", t, perl=TRUE)) > result2 [1] "server101" 相同的PCRE正则表达式(使用类似的(因为它也支持外观),ICU,正则表达式风格):

str_extract

答案 1 :(得分:2)

使用stringr:

library(stringr)
str_match(t, ".*@([^\\.]*)\\..*")[2]
#[1] "server101"