首页 > 解决方案 > 重复捕获组和替换 - 几乎在那里

问题描述

简单明了,我想提取/返回所有以“!>”开头的行并省略任何以“>”开头的行。

我正在寻找一个纯正则表达式解决方案,没有代码或脚本。
我想在 RegExExtract 函数的 Google 表格中使用它。

数据:

> 05/27/21 - Don - another internal note follows
!> 05/27/21 - Don - Client note to provide status
> 05/25/21 - Don - Added task
!> 05/23/21 - Don - another client note from earlier

所需提取物:

!> 05/27/21 - Don - Client note to provide status
!> 05/23/21 - Don - another client note from earlier

我尝试了以下但没有好处。只是想告诉你我不会不费吹灰之力就来这里的。

((?:[^!]\>)+)

没有任何替换来删除不以感叹号开头的行。

但这不起作用。

任何帮助,将不胜感激。
谢谢你有这么棒的社区。

更新:

@WiktorStribiżew - 抱歉,我错过了。谢谢你,所以我不会再深入那个兔子洞了。我现在以不同的方式处理它,它似乎有效。

修订数据

> 05/27/21 - Don - another internal note follows
@ 05/27/21 - Don - Client note to provide status
> 05/25/21 - Don - Added task
@ 5/23/21 - Don - an earlier client note

并使用这个公式:

=substitute( 
    trim( 
        regexreplace( B3, "(?:>.*)", "" ) 
    ), 
    char(10) & char(10), 
    char(10)
)

给了我想要的输出:

@ 05/27/21 - Don - Client note to provide status
@ 5/23/21 - Don - an earlier client note

从这里我可以用更好的东西替换'@'指示符

再次感谢。

标签: regexregex-group

解决方案


我建议使用

=regexreplace( 
    trim( 
        regexreplace( B3, "(?m)^>.*", "" ) 
    ), 
    "(\n){2,}", 
    "$1"
)

注意事项

  • trim(regexreplace( B3, "(?m)^>.*", "" ))- 从内容中删除所有以开头的行<并修剪结果
  • regexreplace(..., "(\n){2,}", "$1")- 用一次替换任何两个或多个连续的换行符。

详情

  • (?m)- 一个多线标志,使^匹配线开始和$线结束位置
  • ^- 一行的开始
  • >- 一个>字符
  • .*- 除换行符之外的零个或多个字符,尽可能多。

(\n){2,}模式是一个重复的捕获组,匹配 2 个或更多 LF 字符,同时仅在捕获组内存缓冲区中保留最后一次捕获的事件,并$1引用该值。


推荐阅读