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
我想匹配像 \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