首页 > 解决方案 > R:匹配奇数次重复

问题描述

我想匹配一个 "\sequence" 字符串,但不是在转义反斜杠时。

我认为这样做的一种方法可能是匹配奇数个反斜杠,例如:

\codewill be 1234, but \\code, should stay as is , \\\codewill 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”(当不转义时),那同样可以。

标签: rregexescapingregex-greedyregexp-replace

解决方案


您可以使用

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

推荐阅读