【问题标题】:Positive Lookbehind and Lookahead to the end of string正向 Lookbehind 和 Lookahead 到字符串末尾
【发布时间】:2020-09-07 21:06:39
【问题描述】:

我的字符串模式如下所示: UNB+UNOC:3+4399945681577+_GLN_Company__+180101:0050+10870,我试图提取倒数第​​二个 + 之后的所有内容,即 180101:0050+10870

到目前为止,我设法使用表达式(?<=\+)[^\+]+(?=\+[^\+]*$) 处理倒数第二个块180101:0050,但未能包括最后一个块,包括最后一个+。这是我的示例:regex101

该表达式是为 R 设计的,稍后我仍然需要对字符进行转义。此格式仅用于 Regex101 中的测试目的。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    我们可以根据字符串末尾 ($) 中出现的+ 来捕获组。

    sub(".*\\+([^+]+\\+[^+]+$)", "\\1", str1)
    #[1] "180101:0050+10870"
    

    数据

    str1 <- "UNB+UNOC:3+4399945681577+_GLN_Company__+180101:0050+10870"
    

    【讨论】:

    • 谢谢@akrun 这也很好用。您是否认为这也可以更改为 tidyverse::str_replace() 语法。我目前正在使用此函数中的所有表达式,并且为了我的脚本简洁起见,我会尽量保持这一点。
    • @Max 那只是直接翻译str_replace(str1, ".*\\+([^+]+\\+[^+]+$)", "\\1")
    • 抱歉,我在将"\\1" 添加到脚本时不小心错过了末尾的"\\1"。完美,非常感谢!
    【解决方案2】:

    你可以使用

    \+\K[^+]+\+[^+]*$
    

    或者,如果您想将它与stringr::str_extract 一起使用:

    (?<=\+)[^+]+\+[^+]*$
    

    请参阅regex demo。详情:

    • \+ - 一个 + 字符
    • \K - 匹配重置运算符
    • (?&lt;=\+) - 在 + 符号之后的位置
    • [^+]+ - 除了+ 之外的一个或多个字符
    • \+ - 一个+
    • [^+]+ - 除了+ 之外的一个或多个字符
    • $ - 字符串结束。

    R demo online:

    x <- "UNB+UNOC:3+4399945681577+_GLN_Company__+180101:0050+10870"
    regmatches(x, regexpr("\\+\\K[^+]+\\+[^+]*$", x, perl=TRUE))
    ## => [1] "180101:0050+10870"
    library(stringr)
    str_extract(x, "(?<=\\+)[^+]+\\+[^+]*$")
    ## => [1] "180101:0050+10870"
    

    【讨论】:

    • 谢谢,这很好用。由于这是我在一排提取物中缺少的唯一表达式,您是否认为您也可以帮助将其调整为 tidyverse::str_extract() 语法?似乎不支持 \K 评论,但这也可能是我的误解。 evoldyn.gitlab.io/evomics-2018/ref-sheets/R_strings.pdf
    • @Max 只需使用str_extract(x, "(?&lt;=\\+)[^+]+\\+[^+]*$"),见R demo
    【解决方案3】:

    在这种情况下你可以做的另一种方式:

    library(stringr)
    str_extract("UNB+UNOC:3+4399945681577+_GLN_Company__+180101:0050+10870", "\\d+:\\d+\\+\\d+")
    #"180101:0050+10870"
    

    【讨论】:

    • 谢谢@Tho Vu,这也有效。不过,我不确定在所有分隔符都需要匹配模式的意义上它是否过于严格。因此我的想法是回顾第二次+,然后期待提取剩余的字符串。
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多