gsub返回\ n(换行符)

时间:2014-07-24 08:16:37

标签: regex r gsub

我有正则表达式的这种行为,我无法解释。我的目标是仅在@之后解析文本,但当我的字符串包含\n前面有一些单词时,gsub也会解析\n

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

2 个答案:

答案 0 :(得分:3)

与Perl兼容的正则表达式.\n不匹配。这与“正常”正则表达式形成对比。看看这个例子:

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

如果您指定perl = FALSE

,您的代码将有效
gsub("^\\.?@([a-z0-9_]{1,15})[^a-z0-9_]+.*$", "\\1", string, perl = FALSE)
# [1] "address"

答案 1 :(得分:0)

要提取address,您还可以使用:

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