2016-12-16 5 views
-1

私は正規表現を使用してRで、この文字列からサーバー名(server101)を抽出しようとしています:Rの2文字の間にどのように値を抽出しますか?

値をと、次の最初の期間@

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

私は(。)これを試しました:

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

これは問題ありませんでした。

stringrと
+0

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

答えて

2

:あなたが最初の@後([^.]+.以外の文字を1+抽出するために、以下の基本Rコードを使用することができ

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

だけFYI: 'str_match'は、完全な文字列の一致を必要としません。また、文字クラス内のドットはリテラルドットとして扱われ、エスケープする必要はありません。 '@'の後にいくらかの値が期待されるので、 '+'(1回以上の出現)は '*'(0回以上の出現)より論理的です。したがって、私は 'str_match'で以下のパターンを使用します:' "@([^。] +)" '。 –

+0

おかげさまで、情報のために@WiktorStribiżew、大変感謝しています。 –

1

regexec

> 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" 

を、することができますサブグループにアクセスする(グループの内容を取り込む)。

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

online R demo

もう一つの方法は、試合に文字を入れていない文字の存在のためにのみチェックしますが、(?<[email protected])後読みでregexでPCREでregmatches/regexprを使用することです参照してください。

Aクリーンstringrアプローチは、同様のPCRE正規表現(同じように(ルックアラームもサポートするため)、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" 
関連する問題