我有这种regex的行为,我无法解释。我的目标是只解析@
之后的文本,但是当我的字符串包含n
之前有一些单词时,gsub
也解析n
:
string <- ".@address something n"
gsub("^\.?@([a-z0-9_]{1,15})[^a-z0-9_]+.*$", "\1", string, perl=T);
# [1] "addressn"
string <- ".@address n"
gsub("^\.?@([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("^\.?@([a-z0-9_]{1,15})[^a-z0-9_]+.*$", "\1", string, perl = FALSE)
# [1] "address"
要提取address
,还可以使用:
library(stringr)
str_extract(string, perl('(?<=@)[a-z0-9_]+(?= )'))
#[1] "address"