Notepad++ 中的正则表达式删除某些 CRLF

Regex in Notepad++ to remove certain CRLFs

鉴于此示例数据:

00-1234T|`CRLF`
Data|Commments|`CRLF`
12-3456|Some data|Notes|`CRLF`
65-8436ZZ|Data|`CRLF`
|`CRLF`
45-4576AA|Some data|Comments|`CRLF`
98-4392REV|Data|`CRLF`
|`CRLF`
00-5432|Some Data|Some Comments|

(我在每行中添加了“CRLF”以更清楚地说明那里有什么以及需要替换什么)

每条记录在一行中只能有三个竖线,第三个竖线后有一个 CRLF。所以第 1、4 和 7 行(pre-find/replace)需要修复,这意味着第三个管道之前的任何 CRLF 需要用“占位符”替换,这将是“#CRLF# ".

我能想到的最接近的是 ^((?:[^\v|]*\|){3})(.+),它将匹配(突出显示)第 3 和 4、6 和 7 以及 9 和 10 行。我的期望(要求)是在第 2、5 和 8 行中找到 CRLF 并将其替换为“#CRLF#”。

[更新]

在这个问题上睡了一觉后,我醒来意识到,为了更准确地找到给定记录的开头 - 无论是一行还是多行 - 我应该补充说第一列将 总是 以模式 [0-9][0-9]-[0-9][0-9][0-9][0-9] 开头,可能 之后最多有三个字母数字字符。

我修改了上面的示例数据以反映这一点。

这应该可以帮助您入门。
正则表达式只是捕获管道之间的部分,然后在替换时重新写入。
任何 CRLF 都不会被捕获并被删除。
但这非常简单,如果您的输入更复杂,可能需要更改。

 (?m)^([^|\r\n]*)[\r\n]*\|[\r\n]*([^|\r\n]*)[\r\n]*\|[\r\n]*([^|\r\n]*)[\r\n]*\|[\r\n]*

替换为:|||\n

https://regex101.com/r/WzDLwf/1

更新答案

回答你更新的问题,如果你需要像邮件合并一样,
也可以这样做(作为 Toto 方法的替代方法)。

(?m)
(?:
   ^ \d{2} - \d{4} [^|\r\n]* \| 
 | \G 
)
(?: [^|\r\n]* \| )*
\K 
[\r\n]+ (?! [\r\n]* (?: ^ \d{2} - \d{4} | $ ) )

https://regex101.com/r/qK4SJP/1

  • Ctrl+H
  • 查找内容:\R(?!\d\d-\d{4}\w{0,3}\|)
  • 替换为:#CRLF#
  • 检查 环绕
  • 检查 正则表达式
  • 全部替换

解释:

\R              # any kind of linebreak (i.e. \r, \n, \r\n), 
                     if you want to match only windows EOL, use \r\n
(?!             # negative lookahead, make sure we haven't after:
    \d\d-\d{4}      # 2 digit dash 4 digit
    \w{0,3}         # word character from 0 upto 3
    \|              # a pipe
)               # end lookahead

屏幕截图(之前):

截图(之后):