首页 > 解决方案 > 捕获组中的正则表达式替换

问题描述

我有一段来自 EDI X12 的文本。我试图找到一个BBQ段后面跟着另一个BBQ段的行。我想将BBQ第二行中的所有段替换为BBB

原始文本

HI*BBR<0Y6D0Z1<D8<20190816~
HI*BBQ<05BC0ZZ<D8<20190806*BBQ<05BB0ZZ<D8<20190729*BBQ<06UM07Z<D8<20190729~
HI*BBQ<0JBL0ZZ<D8<20190809*BBQ<0J9N0ZZ<D8<20190816*BBQ<0KBS0ZZ<D8<20190816~
HI*BI<71<RD8<20190716-20190722~

需要成为

HI*BBR<0Y6D0Z1<D8<20190816~
HI*BBQ<05BC0ZZ<D8<20190806*BBQ<05BB0ZZ<D8<20190729*BBQ<06UM07Z<D8<20190729~
HI*BBB<0JBL0ZZ<D8<20190809*BBB<0J9N0ZZ<D8<20190816*BBB<0KBS0ZZ<D8<20190816~
HI*BI<71<RD8<20190716-20190722~

这针对我在捕获组 3 中寻找的内容,但是如何在该组中BBQ替换BBB

(^HI\*BBQ.+?~\r\n)(^HI\*)(BBQ.+?~\r\n)

感谢您的任何想法!

标签: regexnotepad++

解决方案


  • Ctrl+H
  • 找什么:(?:^HI\*BBQ\b.+?~\RHI\*BB|\G(?!^).*?\bBB)\KQ\b
  • 用。。。来代替:B
  • 检查 火柴盒
  • 检查 环绕
  • CHECK 正则表达式
  • 取消选中 . matches newline
  • Replace all

解释:

(?:         # non capture group
^           # begining of line
  HI\*BBQ   # literally
  .+?       # 1 or more any character but newline
  ~         # a tilde
  \R        # any kind of linebreak
  HI\*BB    # literally
|           # OR
  \G        # restart from last match position
  (?!^)     # not at the beginning of line
  .*?BB     # 0 or more any character but newline, not greedy, followed by BB
)           # end group
  \K        # forget all we have seen until this position
  Q         # the letter Q

屏幕截图(之前):

在此处输入图像描述

屏幕截图(之后):

在此处输入图像描述


推荐阅读