我想要一个in (?)
字符之前的变量名。
例如:
expect_equal("x", foo("select * from t where x in (?)"))
这是我的尝试:
stmt <- "select * from t where x in (?)"
idxParam <- gregexpr("x in\\(?", stmt)[[1]]
substring(stmt, idxParam, idxParam + 1)
但是当单词的长度> 1时,它将失败...也许有一个子字符串函数,该函数将单词的第一个字母作为参数并在空格上结束?
答案 0 :(得分:1)
这是一种方法:
stmt <- "select * from t where x in (?)"
stmt_trimmed <- sub(" in \\(\\?\\)","", stmt) # [1] "select * from t where x"
tail(strsplit(stmt_trimmed," ")[[1]],1)
# [1] "x"
我不知道您到底想做什么,但是有些错误并没有使?
转义,并且忘记了in
之后的空格
回复:如何处理:从t中选择*,其中x in(?)和y in(?)
x <- "select * from t where x in (?) and y in (?)"
pattern <- " ([^ ]+) in \\(\\?\\)"
raw_matches <- regmatches(x,gregexpr(pattern,x))
clean_matches <- gsub(pattern,"\\1",raw_matches[[1]])
clean_matches
# [1] "x" "y"
答案 1 :(得分:1)
使用stringr
:
library(stringr)
string <- "select * from t where x in (?)"
str_extract(string, "\\w+(?=\\s+in)")
此解决方案使用正向前瞻来提取\\s+in
之前的第一个单词。其中\\s+
是任意数量(> 0)的空格。
可以轻松翻译 进入基数R:
sub(".+(\\w+)(?=\\s+in).+", "\\1", string, perl = TRUE)
编辑:一种非正则表达式解决方案,也可以处理许多in
:
string_split <- strsplit(string, " ")[[1]]
string_split[which(string_split == "in") - 1]