如何使用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, "")
答案 0 :(得分:3)
第一个问题是您需要转义字符串中的\
:
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"
答案 1 :(得分:2)
其他答案提供了使用strsplit
或str_split
解决问题的一些非常好的替代方法。
但是,如果确实想要使用正则表达式和gsub
,则此解决方案会将前两个匹配项(字符串后跟句点)替换为空字符串。
注意使用?
修饰符告诉正则表达式不要贪婪,以及{2}
修饰符告诉它在括号中重复两次表达式。
gsub("\\.", "", gsub("(.+?\\.){2}", "", st))
[1] "DATABASE_NAME"
答案 2 :(得分:1)
另一种方法是在str_split
包中使用stringr
。我们的想法是在每个时期将st分成字符串,然后隔离第三个字符串:
st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."
library(stringr)
str_split(st, "\\.")[[1]][3]
[1] "DATABASE_NAME"