为了对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}"
我可能会错过一些非常明显的方法,所以我希望有人可以提供帮助。
答案 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}"