我知道這個問題之前已經被問過和回答過(例如用其他東西替換字串中第 N 次出現的字符或在第 n 次出現的字符和另一個字符之間提取字串),但無論出于何種原因,我都無法獲得相應的正則運算式解決方案作業。
我基本上想從字串中洗掉某個短語的第 n 次出現,特別是在示例中我想洗掉“ab”的第二次出現,但我的嘗試都沒有奏效。
我有一個解決方法,使用str_locate_all,然后str_sub根據短語的位置執行 a ,但我希望有一個簡單的正則運算式解決方案,str_remove或者str_replace如果我想用某些東西替換第二次出現。
text <- "abcdabef"
預期輸出:
"abcdef"
我嘗試過的非作業解決方案(以及許多其他解決方案):
library(stringr)
str_remove_all(y, "(?:ab){2}")
str_remove_all(y, "(?:ab){1}.*(ab)")
uj5u.com熱心網友回復:
要僅洗掉第二次出現,您需要使用
sub("(ab.*?)ab", "\\1", "abcdabef")
min要洗掉第 n 次出現,請在唯一值應等于的組之后使用限制量詞n-1:
n <- 2
sub(paste0("((?:ab.*?){",n-1,"})ab"), "\\1", "abcdabef", perl=TRUE)
注意:
您需要使用sub,而不是gsub因為您只需要完成一次更換。
圖案細節(當n=3):
((?:ab.*?){2})- 第 1 組 (\1):出現的兩次ab以及除換行符之外的任何零個或多個字符(因為我在perl=TRUE這里使用,如果您需要多行匹配支持,(?s)請在開頭添加或替換.*?為(?s:.*?))盡可能少ab- 一個ab
如果您有任意字串,其中包含特殊字符,則需要對它們進行轉義:
regex.escape <- function(string) {
gsub("([][{}() *^$|\\\\?.])", "\\\\\\1", string)
}
word <- "a (b)"
word <- regex.escape(word)
text <- "a (b)1___a (b)2___a (b)3___a (b)4"
n <- 3 # Let's remove the 3rd occurrence of a (b)
sub(paste0("((?:", word, ".*?){",n-1,"})", word), "\\1", text, perl=TRUE)
## => [1] "a (b)1___a (b)2___3___a (b)4"
請參閱正則運算式演示。
uj5u.com熱心網友回復:
另一種可能的解決方案, using stringrand no regex(它也適用于 any n):
library(tidyverse)
text <- "abcdabef"
n <- 2
str_locate_all(text, "ab") %>% .[[1]] %>%
when(n <= nrow(.) ~ `str_sub<-`(text, .[n, 1], .[n, 2], value = ""), ~ text)
#> [1] "abcdef"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479794.html
