gsub返回\ n(换行符)

问题描述:

我有这种行为的正则表达式,我无法解释。我的目标是但当我的字符串包含\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" 

在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 –

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

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