Notepad++ 中的 RegEx 查找管道少于或多于 n 的行

RegEx in Notepad++ to find lines with less or more than n pipes

我有一个大的竖线分隔的文本文件,每行应该有一个 3 列记录。许多记录在一列中被换行符分割。

我需要做一个 find/replace 来为每个 line/record 获得三个,而且只有三个管道。

这是一个示例(我添加了换行符 (\r\n) 以演示它们的位置以及需要替换的内容):

12-1234|The quick brown fox jumped over the lazy dog.|Every line should look similar to this one|\r\n
56-7890A|This record is split\r\n
\r\n
on to multiple lines|More text|\r\n
09-1234AS|\r\n
||\r\n
\r\n
56-1234|Some text|Some more text\r\n
|\r\n
76-5432ABC|A record will always start with two digits, a dash and four digits|There may or may not be up to three letters after the four digits|\r\n

需要注意的是,我需要为目标系统保留那些中间记录换行符。它们需要替换为 \.br\。所以上面的最终结果应该是这样的:

12-1234|The quick brown fox jumped over the lazy dog.|Every line should look similar to this one|\r\n
56-7890A|This record is split\.br\.br\on multiple lines|More text|\r\n
09-1234AS|\.br\||\.br\r\n
56-1234|Some text|Some more text\.br\|\r\n
76-5432ABC|A record will always start with two digits, a dash and four digits|There may or may not be up to three letters after the four digits|\r\n

如您所见,记录中间的换行符已全部替换为 \.br\,并且保留了行尾的换行符以将每个 three-column/pipe 记录保留在自己的行中.注意最后一条记录的文本,解释每个 line/record 是如何开始的。我将其包括在内,以防有助于构建正则表达式以正确识别记录的开头。

我不确定这是否可以在一个 find/replace 步骤中完成,或者是否需要(或应该)分成几个步骤。

我想先搜索 |\r\n,因为所有记录都以竖线和 CRLF 结尾,然后用虚拟文本 !@#$ 替换它们。然后用 \r\n 搜索剩余的换行符,这将是中间列换行符并将它们替换为 \.br\,然后用我想要保留的原始换行符替换虚拟文本 |\r\n.

除了看起来像第一个示例中的第三条记录的记录外,这对所有记录都有效,该示例在记录中的竖线之后有几个换行符。在我处理的如此大的文件中,直到很久以后我才发现我使用的上述过程没有正确捕获这些实例。

你可以使用

(?:\G(?!^(?<!.))|^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?)\K\R+

替换为\.br\。参见regex demo详情:

  • (?:\G(?!^(?<!.))|^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?) - 上一场比赛结束 (\G(?!^(?<!.))) 或 (|) 一行开始,两位数,0,一个或多个数字,零个或多个字母,|,然后是 | 以外的任何零个或多个字符,尽可能少,然后是可选的 | 序列和任何零个或多个字符除了 |,尽可能少(参见 ^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?
  • \K - 省略匹配的文本
  • \R+ - 一个或多个换行符。

查看 Notepad++ 演示:

如果您需要在此之后删除空行,请使用 Edit > Line Operations > Remove Empty Lines.