【问题标题】:Replace the last occurence of a string (and only it) using regular expression使用正则表达式替换最后一次出现的字符串(并且只有它)
【发布时间】:2017-09-08 08:24:16
【问题描述】:

我有一个字符串,比如说 MyString = "aabbccawww"。我想使用 gsub 表达式将 MyString 中的最后一个“a”替换为“A”,只有它。那是“aabbccAwww”。我在网站上发现了类似的问题,但他们都要求替换最后一次出现的内容以及之后的所有内容。 我试过 gsub("a[^a]*$", "A", MyString),但它给出了 "aabbccA"。我知道我可以为此目的使用 stringi 函数,但我需要在使用此类函数会很复杂的代码的一部分中实现解决方案,所以我想使用正则表达式。 有什么建议吗?

【问题讨论】:

    标签: r regex


    【解决方案1】:

    您可以使用stringi 库,它使处理字符串变得非常容易,即

    library(stringi)
    
    x <- "aabbccawww"
    stri_replace_last_fixed(x, 'a', 'A')
    #[1] "aabbccAwww"
    

    【讨论】:

      【解决方案2】:

      我们可以使用sub来匹配'a'后跟零个或多个不是'a'的字符([^a]*),将其捕获为组((...))直到字符串结尾(@ 987654324@) 并将其替换为“A”,后跟捕获组的反向引用 (\\1)

      sub("a([^a]*)$", "A\\1", MyString)
      #[1] "aabbccAwww"
      

      【讨论】:

      • 谢谢。你有什么建议不使用“A\\1”而是一个空的替代品吗?所以只是一个正则表达式,它会告诉:字符串中的最后一个“a”。
      【解决方案3】:

      虽然 akrun 的回答应该可以解决问题(不确定,尚未使用 \1 等),但您也可以使用 Lookout:

      a(?!(.|\n)*a)
      

      这基本上是说:找到一个后面没有任何字符的a 和一个a(?!x) 是所谓的lookout,意思是搜索到的表达式不会被包含在匹配中。

      您需要(.|\n),因为. 指代所有字符,换行符除外。

      有关lookout或其他正则表达式的参考,我可以推荐http://regexr.com/

      【讨论】:

      • 我试过了:gsub("a(?!(.|\n)*a)" ,"A", MyString)。它不起作用“无效的正则表达式”。你有什么想法吗?
      • 可能是 R 中的正则表达式不支持监视,我不是 R 开发人员 - 我只是试图给出一个通用的解决方案。无论如何,如果它不支持了望,只需转储我的解决方案,在这种情况下它不会有任何帮助。另一个想法,虽然我不知道这在 R 中是否可行:你能向后迭代你的字符串吗?如果是这样,您可以替换第一个找到的a(等于字符串中最后一个a,因为您要倒退)并获得所需的结果。
      • 您可以设置标志 perl = TRUE 在 R 中使用 perl 兼容的正则表达式(例如 sub("a(?!(.|\n)*a)", "", MyString, perl = TRUE)
      猜你喜欢
      • 2011-09-10
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      相关资源
      最近更新 更多