【问题标题】:R: Match an odd number of repetitionsR:匹配奇数次重复
【发布时间】:2020-09-21 11:47:28
【问题描述】:

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

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

\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))
# \1234

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

当然,如果有更好的策略来匹配“\sequence”(当不转义时),那也同样可以。

【问题讨论】:

    标签: r regex escaping regex-greedy regexp-replace


    【解决方案1】:

    你可以使用

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

    替换为1234。请参阅regex demo

    详情

    • (?&lt;!\\) - 如果在当前位置的左侧有一个 \,则失败
    • (?:\\{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
    

    【讨论】:

    • 谢谢,K 是我不知道的杀手
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多