r - R:匹配奇数次重复
问题描述
我想匹配一个 "\sequence" 字符串,但不是在转义反斜杠时。
我认为这样做的一种方法可能是匹配奇数个反斜杠,例如:
\code
will be 1234
, but \\code
, should stay as is , \\\code
will be\\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))
# \1234
正则表达式匹配奇数和偶数情况。为了使它起作用,我应该找到一种更贪婪地匹配双反斜杠“\”的方法(总是在它们存在时),这样第二个反斜杠就不会了。
当然,如果有更好的策略来匹配“\sequence”(当不转义时),那同样可以。
解决方案
您可以使用
rx <- "(?<!\\\\)(?:\\\\{2})*\\K\\\\code"
替换为1234
。请参阅正则表达式演示。
细节
(?<!\\)
\
- 如果在当前位置的左边有一个立即失败(?:\\{2})*
- 匹配并消耗 0 次或多次出现的双反斜杠\K
-匹配重置运算符,丢弃到目前为止匹配的所有文本\\code
-\code
文字。
在线查看R 演示:
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