2011-04-16 44 views
2

如何僅使用POSIX樣式正則表達式從此字符串中提取DATABASE_NAME?R:使用POSIX正則表達式從字符串中提取數據

st <- "MICROSOFT_SQL_SERVER.DATABASE\INSTANCE.DATABASE_NAME." 

首先,這會產生一個錯誤

Error: '\I' is an unrecognized escape in character string starting "MICROSOFT_SQL_SERVER.DATABASE\I" 

我想這樣

sub(".*\\.", st, "") 
+0

相反,你可以的indexOf第二和第三點(。),然後,可以串它來獲得DATABASE_NAME ... – Muse 2011-04-16 10:18:53

+0

還值得指出的是,你有第二個和第三個參數錯誤的方式輪你的Q.它是'sub(模式,替換,字符串)' – 2011-04-16 11:23:09

回答

3

第一個問題是,你需要逃避你的字符串\

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME." 

至於主要的問題,這將返回你從你給字符串要位:

> sub("\\.$", "", sub("[A-Za-z0-9\\._]*\\\\[A-Za-z]*\\.", "", st)) 
[1] "DATABASE_NAME" 

但是一個簡單的解決方案將是分裂的\\.並選擇最後一個塊:

> strsplit(st, "\\.")[[1]][3] 
[1] "DATABASE_NAME" 

或略微更自動化

> sst <- strsplit(st, "\\.")[[1]] 
> tail(sst, 1) 
[1] "DATABASE_NAME" 
+0

+1對於字符串分裂想法顯示'sub'和'strsplit'+1 – Andrie 2011-04-16 11:03:12

1

另一種方法是在封裝stringr使用str_split。這個想法是ST在每個週期分成字符串,然後到第三串隔離:

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME." 

library(stringr) 

str_split(st, "\\.")[[1]][3] 

[1] "DATABASE_NAME" 
+1

+1 - 在戰鬥後考慮與基本R解決方案類似的線與那個正則表達式。 – 2011-04-16 10:56:58

2

提供開裂使用strsplitstr_split問題的一些很好的替代方式與其他的答案。

但是,如果你真的要使用正則表達式和gsub,該解決方案代用品的前兩個出現(字符串後跟一個句點)與一個空字符串。

請注意使用?修飾符來告訴正則表達式不要貪婪,以及{2}修飾符告訴它重複括號中的表達式兩次。

gsub("\\.", "", gsub("(.+?\\.){2}", "", st)) 
[1] "DATABASE_NAME" 
相關問題