由于您只期望一个匹配项,因此您可以在此处使用简单的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"):
-
\\. - 一个点(您需要转义的其他字符是$、^、*、(、)、+、[、?、@98765)
-
.* - 任何 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"
使用regexec,您可以访问子匹配(捕获组内容)。
见online R demo
另一种方法是将regmatches/regexpr 与带有(?<=@) 后视的PCRE 正则表达式一起使用,仅检查字符是否存在,但不将字符放入匹配中:
> result2 <- regmatches(t, regexpr("(?<=@)[^.]+", t, perl=TRUE))
> result2
[1] "server101"
一个干净的 stringr 方法是使用与str_extract 相同的 PCRE 正则表达式(使用类似的(因为它也支持环视)、ICU、正则表达式风格):
> library(stringr)
> t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com")
> str_extract(t, "(?<=@)[^.]+")
[1] "server101"