【问题标题】:Regex in Notepad++ to remove certain CRLFsNotepad++ 中的正则表达式删除某些 CRLF
【发布时间】:2021-10-13 10:38:46
【问题描述】:

鉴于此示例数据:

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

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

[更新]

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

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

【问题讨论】:

    标签: regex notepad++


    【解决方案1】:

    这应该可以帮助您入门。
    正则表达式仅捕获管道之间的部分,然后重写替换。
    任何 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

    【讨论】:

    • 这会正确找到“孤儿”CFLFs,但它只会将其删除并将每条记录放在一行中。我需要用占位符保留那些(因此用#CRLF#替换),以便以后可以放回它们。如何将“#CRLF#”添加到您的替换代码中?
    • @marky - 确保可以这样做,请参阅更新帖子。如果需要,提供更多记录验证。
    【解决方案2】:
    • Ctrl+H
    • 查找内容:\R(?!\d\d-\d{4}\w{0,3}\|)
    • 替换为:#CRLF#
    • 检查 环绕
    • CHECK 正则表达式
    • 全部替换

    说明:

    \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
    

    屏幕截图(之前):

    截图(之后):

    【讨论】:

    • 为了确保它正常工作,我进入了查找/替换设置并单击“查找下一个”,但是当它突出显示第一行上的 CRLF 并单击替换时,CRLF 是没有被替换,亮点刚刚转到下一个CRLF。但是当我单击全部替换时,它起作用了。所以它可以工作,但我正在处理一个巨大的文件(在清理CFLRs 之前有 160k+ 行),我宁愿逐步完成几次,直到我确保它按需要工作。知道为什么会这样吗?
    • 以上补充:@sln 在我单击查找下一个然后替换、查找下一个、替换等时起作用
    • @marky:这种奇怪的行为我见过几次,不知道为什么,可能是 Notepad++ 的 bug!
    • @marky:如果你的文件很大,最好写个脚本。或者,用您文件的一小部分测试我的正则表达式,如果它工作正常,请替换整个文件。
    • @marky:根据您的编辑,使用 Find: \R(?!\d\d-\d{4}\w{0,3}\|) ;替换:#CRLF#,这是一步一步的工作以及全部替换。
    猜你喜欢
    • 2017-02-20
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多