R:匹配奇数次重复

R: Match an odd number of repetitions

我想匹配像 \code 这样的字符串,但当反斜杠被转义时就不会。

我认为一种方法是匹配奇数个反斜杠。那么例如,假设 \code 是一个要被替换为 1234:

的表达式

\code 会是 1234,但是 \code 应该保持原样,\\code 会是 \1234,等等

在 R 中,给定字符串:

message(o <- "\\\code")
# \\code
message(e <- "\\code")
# \code

R 中的部分工作尝试是:

message(gsub("((?:\\{2})?)\\code", "\11234", o, perl=TRUE))
# \1234
message(gsub("((?:\\{2})*)\\code", "\11234", e, perl=TRUE))
# 34

正则表达式匹配奇数和偶数大小写。为了让它工作,我应该找到一种方法来更贪婪地匹配双反斜杠“\”(总是在它们存在时),这样第二个反斜杠就不会。

当然,如果有更好的策略来匹配“\sequence”(未转义时),那同样没问题。

您可以使用

rx <- "(?<!\\)(?:\\{2})*\K\\code"

替换为1234。见 regex demo.

详情

  • (?<!\) - 如果 \ 紧邻当前位置
  • 的左侧,则失败
  • (?:\{2})* - 匹配并消耗 0 次或多次出现的双反斜杠
  • \K - 丢弃到目前为止匹配的所有文本的匹配重置运算符
  • \code - \code 文本。

看到一个 R demo online:

rx <- "(?<!\\)(?:\\{2})*\K\\code"
message(gsub(rx, "1234", "\\\code", perl=TRUE)) # \\code
# => \1234
message(gsub(rx, "1234", "\\code", perl=TRUE))   # \code
# => \code
message(gsub(rx, "1234", "\code", perl=TRUE)) # \code
# => 1234