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} | $ ) )
- 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
屏幕截图(之前):
截图(之后):
鉴于此示例数据:
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} | $ ) )
- 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
屏幕截图(之前):
截图(之后):