用正则表达式条件替换字符串

时间:2019-01-24 11:46:15

标签: r regex gsub stringr stringi

我有一个要匹配并用X替换的模式。但是,我只希望在前面的字符是A,B或没有任何字符(字符串开头)的情况下替换该模式。

我知道如何使用str_replace_all函数替换模式,但是我不知道如何添加此附加条件。我使用以下代码:

library(stringr)

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("XXXX")



replacement <- str_replace_all(string, pattern, paste0("XXXX"))

结果:

[1] "XXXXAXXXXBXXXXCXXXXDXXXXEXXXXAXXXX"

所需结果:

仅在前一个承租人为A,B或没有字符的情况下替换:

[1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"

3 个答案:

答案 0 :(得分:2)

您可以使用

gsub("(^|[AB])0000", "\\1XXXX", string)

请参见regex demo

详细信息

  • (^|[AB])-捕获组1(\1):字符串(^或(|AB[AB]
  • 0000-四个零。

R demo

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("XXXX")
gsub("(^|[AB])0000", "\\1XXXX", string)
## -> [1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"

答案 1 :(得分:0)

能否请您尝试以下。在此使用正向超前方法。

string <- "0000A0000B0000C0000D0000E0000A0000"
gsub(x = string, pattern = "(^|A|B)(?=0000)((?i)0000?)",
    replacement = "\\1xxxx", perl=TRUE)

输出如下。

[1] "xxxxAxxxxBxxxxC0000D0000E0000Axxxx"

答案 2 :(得分:0)

感谢WiktorStribiżew的回答!它也适用于stringr软件包:

library(stringr)

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("0000")

replace <- str_replace_all(string, paste0("(^|[AB])",pattern), "\\1XXXX")
replace

[1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"