2014-07-24 72 views
2

我有這種行爲的正則表達式,我無法解釋。我的目標是但當我的字符串包含\n一些前面加上了@後解析只有文字,gsub\n解析:gsub返回 n(換行符)

string <- "[email protected] something \n" 
gsub("^\\[email protected]([a-z0-9_]{1,15})[^a-z0-9_]+.*$", "\\1", string, perl=T); 
# [1] "address\n" 
string <- "[email protected] \n" 
gsub("^\\[email protected]([a-z0-9_]{1,15})[^a-z0-9_]+.*$", "\\1", string, perl=T); 
# [1] "address" 

回答

3

在Perl兼容的正則表達式.不匹配\n。這與「正常」正則表達式形成對比。看看這個例子:

grepl(".", "\n", perl = FALSE) 
# [1] TRUE 
grepl(".", "\n", perl = TRUE) 
# [1] FALSE 

如果指定perl = FALSE你的代碼將工作:

gsub("^\\[email protected]([a-z0-9_]{1,15})[^a-z0-9_]+.*$", "\\1", string, perl = FALSE) 
# [1] "address" 
+0

你可以做點到甚至可以通過在第一次添加's'修飾符來匹配甚至是新行字符。嘗試'grepl(「(?s)。」,「\ n」,perl = TRUE)' –

+0

好主意! @AvinashRaj –

0

要提取address,你也可以使用:

library(stringr) 
str_extract(string, perl('(?<[email protected])[a-z0-9_]+(?=)')) 
#[1] "address"