0

鉴于此示例数据:

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 行(预查找/替换),这意味着CRLF需要将第三个管道之前的任何 s 替换为“占位符”,即“#CRLF#”。

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

[更新]

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

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

4

2 回答 2

1
  • Ctrl+H
  • 找什么:\R(?!\d\d-\d{4}\w{0,3}\|)
  • 用。。。来代替:#CRLF#
  • 检查 环绕
  • CHECK 正则表达式
  • Replace all

解释:

\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

截图(之前):

在此处输入图像描述

截图(之后):

在此处输入图像描述

于 2021-08-10T08:04:12.723 回答
0

这应该让你开始。
正则表达式只是捕获管道之间的部分,然后重写替换。
任何 CRLF 都不会被捕获并被剥离。
但这非常简单,如果您的输入更复杂,可能需要更改。

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

替换使用: $1|$2|$3|\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

于 2021-08-09T23:51:26.303 回答