我想使用正则表达式来替换字符串周围的命令或标签。我的用例是将LaTeX命令转换为bookdown命令,这意味着执行诸如将\citep{*}
替换为[@*]
,\ref{*}
替换为\@ref(*)
等等。但是,让我们坚持一般化问题:
给定一个字符串<begin>somestring<end>
,其中<begin>
和<end>
已知且somestring
是一个任意字符序列,我们是否可以使用正则表达式来设置<newbegin>
和<newend>
获取字符串<newbegin>somestring<newend>
?
例如,考虑我要转换为\citep{bonobo2017}
的LaTeX命令[@bonobo2017]
。对于这个例子:
<begin> = \citep{
somestring = bonobo2017
<end> = }
<newbegin> = [@
<newend> = ]
这个问题基本上与this question相反。
我希望使用R或记事本++解决方案。
其他示例
\citet{bonobo2017}
转换为@bonobo2017
\ref{myfigure}
转换为\@ref(myfigure)
\section{Some title}
转换为# Some title
\emph{something important}
转换为*something important*
我正在寻找一个模板正则表达式,我可以根据具体情况填写<begin>
,<end>
,<newbegin>
和<newend>
答案 0 :(得分:2)
您可以使用dplyr
+ stringr
string = "\\citep{bonobo2017}"
begin = "\\citep{"
somestring = "bonobo2017"
end = "}"
newbegin = "[@"
newend = "]"
library(stringr)
library(dplyr)
string %>%
str_extract(paste0("(?<=\\Q", begin, "\\E)\\w+(?=\\Q", end, "\\E)")) %>%
paste0(newbegin, ., newend)
或:
string %>%
str_replace_all(paste0("\\Q", begin, "\\E|\\Q", end, "\\E"), "") %>%
paste0(newbegin, ., newend)
你也可以为方便起见:
convertLatex = function(string, BEGIN, END, NEWBEGIN, NEWEND){
string %>%
str_replace_all(paste0("\\Q", BEGIN, "\\E|\\Q", END, "\\E"), "") %>%
paste0(NEWBEGIN, ., NEWEND)
}
convertLatex(string, begin, end, newbegin, newend)
# [1] "[@bonobo2017]"
备注:强>
\
添加了"\\citep{bonobo2017}"
,这是因为原始字符串不存在于R中(我希望它们确实存在),因此单\
将被视为转义字符。我需要另一个\
来逃避第一个\
。str_extract
中的正则表达式使用正向lookbehind和positve lookahead在somestring
和begin
之间提取end
。str_replace
采用另一种方法从begin
删除end
和string
。"\\Q"
,"\\E"
对意味着&#34;反斜杠所有非字母数字字符&#34;并且"\\E"
结束了表达。这在您的情况下特别有用,因为您的Latex命令中可能有特殊字符。此表达式会自动为您转义它们。