【问题标题】:R: Extract data from string using POSIX regular expressionR:使用 POSIX 正则表达式从字符串中提取数据
【发布时间】:2011-08-06 20:20:39
【问题描述】:

如何使用 POSIX 样式的正则表达式从该字符串中仅提取 DATABASE_NAME?

st <- "MICROSOFT_SQL_SERVER.DATABASE\INSTANCE.DATABASE_NAME."

首先,这会产生错误

Error: '\I' is an unrecognized escape in character string starting "MICROSOFT_SQL_SERVER.DATABASE\I"

我在想类似的事情

sub(".*\\.", st, "")

【问题讨论】:

  • 相反,您可以 indexOf 第二个和第三个点(。)然后,可以将其子串以获得 DATABASE_NAME...
  • 还值得指出的是,您的 Q 中有第二个和第三个参数错误的方式。它是 sub(pattern, replacement, string)

标签: regex r string


【解决方案1】:

第一个问题是你需要在你的字符串中转义\

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."

至于主要问题,这将从您提供的字符串中返回您想要的位:

> sub("\\.$", "", sub("[A-Za-z0-9\\._]*\\\\[A-Za-z]*\\.", "", st))
[1] "DATABASE_NAME"

但更简单的解决方案是拆分 \\. 并选择最后一个块:

> strsplit(st, "\\.")[[1]][3]
[1] "DATABASE_NAME"

或者稍微自动化一点

> sst <- strsplit(st, "\\.")[[1]]
> tail(sst, 1)
[1] "DATABASE_NAME"

【讨论】:

    【解决方案2】:

    其他答案提供了一些使用strsplitstr_split 解决问题的非常好的替代方法。

    但是,如果您真的想使用正则表达式和gsub,此解决方案会将前两次出现的 a(字符串后跟句点)替换为空字符串。

    注意使用? 修饰符告诉正则表达式不要贪婪,以及使用{2} 修饰符告诉它重复括号中的表达式两次。

    gsub("\\.", "", gsub("(.+?\\.){2}", "", st)) 
    [1] "DATABASE_NAME"
    

    【讨论】:

      【解决方案3】:

      另一种方法是在包stringr 中使用str_split。思路是在每个句点将st拆分成字符串,然后隔离第三个字符串:

      st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."
      
      library(stringr)
      
      str_split(st, "\\.")[[1]][3]
      
      [1] "DATABASE_NAME"
      

      【讨论】:

      • +1 表示字符串拆分的想法 - 在与该正则表达式作战之后,正在考虑与基本 R 解决方案类似的思路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2014-10-17
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多