【问题标题】:gsub returns \n (newline)gsub 返回 \n(换行符)
【发布时间】:2014-07-24 08:16:37
【问题描述】:

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

【问题讨论】:

    标签: regex r gsub


    【解决方案1】:

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

    【讨论】:

    • 您也可以通过在开头添加s 修饰符来使点匹配甚至换行符。试试grepl("(?s).", "\n", perl = TRUE)
    • 好主意! @AvinashRaj
    【解决方案2】:

    要提取address,也可以使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2018-12-26
      • 2020-01-30
      • 2013-03-08
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多