当出现的次数未知时,如何用反向引用进行替换?

时间:2018-05-06 22:00:52

标签: r regex stringr

为了对Bookdown生成的.tex文件进行一些更正,我需要在引用中将}{的出现替换为,,即

s <- "Text.\\autocites{REF1}{REF2}{REF3}. More text \\autocites{REF4}{REF5} and \\begin{tabular}{ll}"

应该成为

"Text.\\autocites{REF1,REF2,REF3}. More text \\autocites{REF4,REF5} and \\begin{tabular}{ll}

因为我需要保留我试图查看反向引用的引用,但我似乎无法做到正确,因为要匹配的组数预先未知。此外,我无法stringr::str_replace_all(s, "\\}\\{", ","),因为}{也出现在文档的其他位置。

到目前为止,我最好的方法是使用后视来仅在\\autocites之后发生替换,但后来我无法得到反向引用和分组:

stringr::str_replace_all(s, "(?<=\\\\autocites\\{)([:alnum:]+)(\\}\\{)", "\\1,")
[1] "Text.\\autocites{REF1,REF2}{REF3}. More text \\autocites{REF4,REF5} and \\begin{tabular}{ll}"

stringr::str_replace_all(s, "(?<=\\\\autocites\\{)([:alnum:]+)((\\}\\{)([:alnum:]+))*", "\\1,\\4")
[1] "Text.\\autocites{REF1,REF3}. More text \\autocites{REF4,REF5} and \\begin{tabular}{ll}"

我可能会错过一些非常明显的方法,所以我希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:1)

很酷的问题 - 我必须学习str_replace的新技巧。您可以将返回值设为函数,并将该函数应用于您选择的字符串。

replace_brakets <- function(str) {
  str_replace_all(str, "\\}\\{", ",")
}

s %>% str_replace_all("(?<=\\\\autocites\\{)([:alnum:]+\\}\\{)+", replace_brakets)
# [1] "Text.\\autocites{REF1,REF2,REF3}. More text \\autocites{REF4,REF5} and \\begin{tabular}{ll}"