在第n次出现字符串中的子字符串后替换/删除

时间:2015-10-29 22:05:02

标签: regex r

我希望R中的sub的正则表达式替换第n次出现的字符串中的字符“;”在该字符串中,其中n是传递给正则表达式的变量号。

  stringA="a; b; c; d; e; f; g; h; i; j;"

    stringB<-sub("^(;){4}.*", "", stringA)
##---------------^My attempt at a regular expression here-------

期望的输出:

stringB
    "a; b; c; d;"

1 个答案:

答案 0 :(得分:6)

您可以使用以下正则表达式:

^((?:[^;]*;){4}).*

匹配:

  • ^ - 字符串开头
  • ((?:[^;]*;){4}) - (组1)捕获包含4(或您通过s变量传递的任何数字)出现的子字符串
    • [^;]* - 除;
    • 以外的0个或多个符号
    • ; - 字面分号
  • .* - 0个或更多字符,尽可能多

在替换模式中使用反向引用\\1,我们恢复结果中的前导子字符串。

请参阅IDEONE demo(此处,限制阈值以字符串形式传递):

stringA="a; b; c; d; e; f; g; h; i; j;"
s <- "4"
stringB <- sub(sprintf("^((?:[^;]*;){%s}).*", s), "\\1", stringA)
stringB
##  "a; b; c; d;"

或者,如果传递整数值

s <- 4
sub(sprintf("^((?:[^;]*;){%d}).*", s), "\\1", stringA)

请参阅another demo