【问题标题】:Replace pattern at end of a string by pattern at the beginning用开头的模式替换字符串末尾的模式
【发布时间】:2021-11-10 22:49:11
【问题描述】:

我对正则表达式很陌生,所以如果这是一个明显愚蠢的问题,我深表歉意。

假设我有一个格式为 (c"fair*", "beaut*") 的字符串,并且我想用开头的插入符号 (^) 替换末尾的星号 (*):c("^公平”,“^美丽”)。我怎么能用 stringr 来做呢?我读过this excellent introduction to regexp,但没有弄清楚。我用 stringr::str_replace_all() 进行了几次尝试,但无济于事。问题似乎是 stringr::str_replace_all() 中的替换不能是正则表达式。是这样吗?如果是,有没有其他方法可以做到这一点?

library(stringr)

x <- c("fair*", "beaut*")
str_replace_all(x, "\\*", "^\\^")
#> [1] "fair^^"  "beaut^^"
str_replace_all(x, "\\*", "^\\^")
#> [1] "fair^^"  "beaut^^"
str_replace_all(x, "\\*", "\\^*")
#> [1] "fair^*"  "beaut^*"
str_replace_all(x, "\\*", "\\^(*)")
#> [1] "fair^(*)"  "beaut^(*)"

reprex package (v2.0.1) 于 2021-09-15 创建

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    这个也有帮助:

    sub("(^[[:alpha:]]+)\\*$", "^\\1", x, perl = TRUE)
    
    [1] "^fair"  "^beaut"
    

    【讨论】:

    • 您不需要在替换模式中转义^。它不是正则表达式。
    • 非常感谢亲爱的维克托。
    【解决方案2】:

    你可以使用

    library(stringr)
    x <- c("fair*", "beaut*")
    str_replace(x, "(.*)\\*$", "^\\1")
    # => [1] "^fair"  "^beaut"
    sub("(.*)\\*$", "^\\1", x)
    # => [1] "^fair"  "^beaut"
    

    请参阅 regex demoR demo online。请注意,str_replace 就足够了,因为这里只能发生一个替换。这就是为什么我还建议将 sub 而不是 gsub 作为基本 R 对应项。

    (.*)\*$ 模式尽可能多地匹配并捕获任何零个或多个字符(换行符除外)到第 1 组,然后只匹配末尾的文字 * 星号字符 (\*)字符串 ($)。

    ^\1 替换模式将匹配项替换为 ^ 和组 1 的值。

    注意:如果您的字符串包含换行符,stringr 解决方案将需要稍微修复:str_replace(x, "(?s)(.*)\\*$", "^\\1")

    【讨论】:

    • @KarstenW。当然,只是问题是 我怎样才能使用 stringr 来做到这一点?
    • 感谢您让我注意到我可以使用 stringr::str_replace(),而不是 stringr::str_replace_all()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多