R正则表达式:隔离引号之间的字符串
Posted
技术标签:
【中文标题】R正则表达式:隔离引号之间的字符串【英文标题】:R regular expression: isolate a string between quotes 【发布时间】:2015-06-13 01:46:57 【问题描述】:我有一个字符串myFunction(arg1=\"hop\",arg2=TRUE)
。我想隔离引号之间的内容(本例中为\"hop\"
)
到目前为止我已经尝试过,但没有成功:
gsub(pattern="(myFunction)(\\(1))(.*)(\\\"1.*\\\"1)(.*)(\\)1)",replacement="//4",x="myFunction(arg1=\"hop\",arg2=TRUE)")
欢迎正则表达式大师的任何帮助!
【问题讨论】:
您需要\"hop\"
或hop
作为答案,因为描述在引号之间?
隔离是什么意思?您的预期输出是什么?
例如\"hop\"
【参考方案1】:
试试
sub('[^\"]+\"([^\"]+).*', '\\1', x)
#[1] "hop"
或者
sub('[^\"]+(\"[^\"]+.).*', '\\1', x)
#[1] "\"hop\""
不需要\"
,因为"
也可以使用
sub('[^"]*("[^"]*.).*', '\\1', x)
#[1] "\"hop\""
如果有多个匹配项,正如@AvinashRaj 在他的帖子中提到的那样,sub
可能没有那么有用。使用stringi
的选项是
library(stringi)
stri_extract_all_regex(x1, '"[^"]*"')[[1]]
#[1] "\"hop\"" "\"hop2\""
数据
x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
x1 <- "myFunction(arg1=\"hop\",arg2=TRUE arg3=\"hop2\", arg4=TRUE)"
【讨论】:
非常感谢,这很好用。你能解释一下第一个解决方案的基本原理吗? @RockScience 第一个解决方案匹配所有不是\"
即[^\"]+
的字符,后跟一个\"
,然后使用捕获组(括号内)获取不是@ 的字符987654333@,使用\\1
提取捕获组。【参考方案2】:
您也可以使用regmatches
函数。 Sub 或 gsub 仅适用于特定输入,对于一般情况,您必须进行抓取而不是删除。
> x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
> regmatches(x, gregexpr('"[^"]*"', x))[[1]]
[1] "\"hop\""
要仅获取引号内的文本,然后将上述函数的结果传递给有助于删除引号的 gsub 函数。
> x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
> gsub('"', '', regmatches(x, gregexpr('"([^"]*)"', x))[[1]])
[1] "hop"
> x <- "myFunction(arg1=\"hop\",arg2=\"TRUE\")"
> gsub('"', '', regmatches(x, gregexpr('"([^"]*)"', x))[[1]])
[1] "hop" "TRUE"
【讨论】:
【参考方案3】:你可以试试:
str='myFunction(arg1=\"hop\",arg2=TRUE)'
gsub('.*(\\".*\\").*','\\1',str)
#[1] "\"hop\""
【讨论】:
【参考方案4】:x <- "myFunction(arg1=\"hop\",arg2=TRUE)"
unlist(strsplit(x,'"'))[2]
# [1] "hop"
【讨论】:
withpaste0("\"",unlist(strsplit(x,'\"',perl=T))[2],"\"")
以获得所需的结果...(在 OP 的问题后检查 cmets)以上是关于R正则表达式:隔离引号之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章
在正则表达式中转义(\')单引号,它在两个单引号之间采用字符串。