我正在尝试使用正则表达式从R中的此字符串中提取服务器名称(server101):
@ 与以下第一个期间(。) 之间的值
t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com")
我试过这个:
gsub('.*\\@(\\d+),(\\d+).*', '\\1', t)
这似乎没有用,有什么想法吗?
答案 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"
,您可以访问子匹配(捕获组内容)。
另一种方法是将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"