2016-12-16 77 views
-1

我试图使用正则表达式来提取此字符串R中的服务器名称(server101):之间你如何提取R中两个字符之间的值?

值@和下面的第一期间

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

I”(。)我试过这个:

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

这似乎没有工作,任何想法?

+0

'GSUB( '@([^] +)|', '\\ 1',T)' – rawr

回答

2

与stringr:

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

仅供参考:'str_match'并不需要一个完整的字符串匹配。此外,字符类中的点被视为字面点,不需要转义。由于'@'后面有一些值,我认为'+'(出现1次或多次)比'*'(零次或多次出现)更具逻辑性。因此,我将'str_match'使用以下模式:'“@([^。] +)”'。 –

+0

感谢@WiktorStribiżew的信息,非常感谢。 –

1

您可以使用下面的基础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与(?<[email protected])回顾后,仅该字符存在的检查,但并没有把字符到匹配的正则表达式:

> result2 <- regmatches(t, regexpr("(?<[email protected])[^.]+", t, perl=TRUE)) 
> result2 
[1] "server101" 

一个干净的stringr的方法将是使用相同的PCRE正则表达式与str_extract(使用类似的(因为它也支持lookarounds),ICU,正则表达式):

> library(stringr) 
> t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com") 
> str_extract(t, "(?<[email protected])[^.]+") 
[1] "server101" 
相关问题