首页 > 解决方案 > 删除 1) 开始和结束模式和 2) 如果没有结束模式、开始模式和结束之间的字符

问题描述

使用两个调用链来解决问题gsub- 出于好奇,我想知道是否有更短的正则表达式来实现我想要实现的目标。(使用Remove the letters between two patterns of strings in R 的解决方案)

我想删除某个模式出现之间的所有字符,或者 - 如果没有“结束模式”,则在“开始”模式和结束之间。

foostring <- c("First test *** no asterisks at the end", 
               "Second test *** asterisks in the middle *** something different",
               "Third test *** more than one asterisk *** something different *** second asterisk ***",
               "Fourth test *** asterisks followed by a special character ***_something different")

# desired output with chain of gsubs

gsub("\\*{3}.*$", "", gsub("\\*{3}.*?\\*{3}", "", foostring)) 
#> [1] "First test "                      "Second test  something different"
#> [3] "Third test  something different " "Fourth test _something different"

标签: rregex

解决方案


您可以使用

gsub("\\*{3}.*?(?:\\*{3}|$)", "",  foostring)

查看R 在线演示

TRE 正则表达式意味着:

  • \*{3}- 三个星号
  • .*?- 尽可能少的任何零个或多个字符
  • (?:\\*{3}|$)- 非捕获组匹配
    • \*{3}- 三个星号
    • |- 或者
    • $ - 字符串结束。

推荐阅读