正则表达式替换{} *之外的文本

时间:2017-10-10 18:38:22

标签: r regex latex notepad++ bookdown

我想使用正则表达式来替换字符串周围的命令或标签。我的用例是将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或记事本++解决方案。

其他示例

  1. \citet{bonobo2017}转换为@bonobo2017
  2. \ref{myfigure}转换为\@ref(myfigure)
  3. \section{Some title}转换为# Some title
  4. \emph{something important}转换为*something important*
  5. 我正在寻找一个模板正则表达式,我可以根据具体情况填写<begin><end><newbegin><newend>

1 个答案:

答案 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在somestringbegin之间提取end
  • str_replace采用另一种方法从begin删除endstring
  • 正则表达式中的"\\Q""\\E"对意味着&#34;反斜杠所有非字母数字字符&#34;并且"\\E"结束了表达。这在您的情况下特别有用,因为您的Latex命令中可能有特殊字符。此表达式会自动为您转义它们。