我正在使用正则表达式替换一些子字符串。替换值将重用部分匹配项。我想不区分大小写地匹配,但是在替换中,我想要匹配的东西的小写版本。

library(stringi)
x <- "CatCATdog"
rx <- "(?i)(cat)(?-i)"
stri_replace_all_regex(x, rx, "{$1}")
# [1] "{Cat}{CAT}dog"

这与我想要的接近,除了“cat”应为小写。也就是说,输出字符串应为"{cat}{cat}dog"

以下代码不起作用,但显示了我的意图。
stri_replace_all_regex(x, rx, "{tolower($1)}")

以下技术确实有效,但是它很丑陋,不是很通用,也不是很有效。我的想法是用匹配我想要的正则表达式代替正则表达式,而不是替换值(即“cat”而不是“{cat}”)。然后在每个输入字符串中搜索第一个匹配项,找到匹配项的位置,替换子字符串,然后寻找下一个匹配项,直到没有更多匹配项为止。糟透了
x <- "CatCATdog"
rx <- "(?i)((?<!\\{)cat(?!\\}))(?-i)"
repeat{
  detected <- stri_detect_regex(x, rx)
  if(!any(detected))
  {
    break
  }
  index <- stri_locate_first_regex(x[detected], rx)
  match <- tolower(stri_match_first_regex(x[detected], rx)[, 2])
  stri_sub(x[detected], index[, 1], index[, 2]) <- paste0("{", match[detected], "}")
}

我觉得必须有更好的方法。

如何用小写字母替换不区分大小写的匹配?

多亏了这些评论的启发,我发现我要找的东西是“replacement text case conversion”。

最佳答案

您可以使用\\L将匹配的大小写更改为小写

gsub(rx, "{\\L\\1}", x, perl=TRUE)

关于regex - 不区分大小写地匹配正则表达式大小写,替换为特定的大小写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39449416/

10-12 17:26
查看更多