正则表达式-抓取之间:右边界未转义

3
我希望从一系列 R .Rd 文件中提取信息。我想要示例(虽然这可以是任何tex标签),并希望在左侧 tex 标签和右花括号之间提取。我还想捕获以某种方式转义的右花括号([}]\\},或者其他我没有考虑到的任何方式)。
所以这里有一个样本和我的提取尝试,但它只捕获第一个转义的右花括号:
## fake tex
x <- "Here we go \\example{ x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n}\n\\end{here}"

## regex to extract
regmatches(x, gregexpr("(?<=\\\\example\\{)([^}]*)(?=\\})", x, perl = TRUE))

当前输出

[[1]]
[1] " x <- 6\ngsub(\"\\"

期望输出结果

" x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n"
2个回答

1

一种方法是先去掉转义花括号,然后再在末尾加上它们:

x <- gsub("\\\\}","\001",x)
x <- gsub("\\[}\\]","\002",x)
match <- regmatches(x, gregexpr("(?<=\\\\example\\{)([^}]*)(?=\\})", x, perl = TRUE))
match <- gsub("\001","\\\\}",match)
match <- gsub("\002","[}]",match)

这句话的意思是:“这会给出”。
> match
[1] " x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n"

好的想法。我会看看其他人是否有额外的回应或对这种方法的批评。+1 - Tyler Rinker
如果有一种方法可以在单个正则表达式调用中实际匹配所需内容而没有任何绕路,那确实很好。 - Stibu

0
以下是期望的输出,至少对于您提供的示例而言:
> gsub(".+example\\{(.+)}.+","\\1",x)
[1] " x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接