gpt4 book ai didi

regex - Notepad++ /BOOST中的错误还是我的正则表达式中的错误?

转载 作者:行者123 更新时间:2023-12-02 00:50:06 24 4
gpt4 key购买 nike

我有一个结构如下的文件:

Line
foo Änderbar: PM baz
Line

Line
foo Änderbar: OM baz
Line

Line
foo Änderbar: ++ baz
Line

Line
foo Änderbar: -- baz
Line

因此,文件由换行分隔的“块”组成(我已将文件转换为Unix行尾)。每个块可以具有任意数量的行。块的每一行至少包含一个不是换行符的字符,并以换行符结尾。分隔块的行仅由一个换行符组成。

在每个块中,只有一行符合以下格式:
  • 至少一个不是换行符的字符,然后是
  • 文字字符串'Änderbar: ',后跟
  • 正好是文字字符串'++''--''OM''PM'之一,后跟
  • 至少一个不是换行符的字符,然后是
  • 换行符

  • 在同一块中,在此特殊行上方始终至少有另一条非空行,在此特殊行之下始终至少有另一条非空行。

    我需要一种有效的方法来查找(并选择) Änderbar:之后的文字为 --的所有块(查找/选择一个块,另一个,再次击中 Find Next后的每个块,即不同时选择所有这些块)。

    通常,我很乐于用Notepad ++解决此类问题。但是,在那种情况下,随着年龄的增长,我似乎变得越来越愚蠢,或者Notepad ++的regex处理引擎中存在错误。

    Notepad ++使用BOOST(并通过BOOST支持PCRE表达式)。由于此方法得到了广泛使用,因此我认为该问题足够重要,可以将其发布在此处,以防万一BOOST确实是行为不端的原因。

    话虽如此:我将该文件加载到Notepad ++中,启动了“搜索和替换”对话框,勾选了 . matches newline,勾选了 Regular Expression,然后在 Find What:文本框中输入了以下正则表达式:
    \n([^\n]+\n)+[^\n]+(Änderbar\:\ --[^\n]+\n)([^\n]+\n)+

    我很惊讶这使Notepad ++表现得很奇怪:将光标放在带有 Änderbar: --的块之前的空白行中,点击 Find Next发现/选择了该块。但是当光标在另一个位置时,点击 Find Next使Notepad ++查找/选择文件的其余部分,即光标位置下方的所有块。

    然后我测试了是否可以在 ++之后找到具有 Änderbar:的块,即我将正则表达式更改为
    \n([^\n]+\n)+[^\n]+(Änderbar\:\ \+\+[^\n]+\n)([^\n]+\n)+

    猜猜是什么:这在每种情况下都可靠地起作用。对于最后两者,情况相同:
    \n([^\n]+\n)+[^\n]+(Änderbar\:\ PM[^\n]+\n)([^\n]+\n)+
    \n([^\n]+\n)+[^\n]+(Änderbar\:\ OM[^\n]+\n)([^\n]+\n)+

    因此,在某些情况下,Notepad ++ / PCRE似乎无法正确解释 -,或者我的regex中有一个细微的错误,该错误仅在我在各自位置搜索 --(而不是 ++OMPM)时触发。

    请注意,我已经尝试过将 \放在空格字符前面(这实际上只会使情况变得更糟,但是我已经尝试过以防万一),并且我还尝试过使用 \-\-而不是 --(尽管后者应该可以)。这并没有以任何方式改变(错误)行为。

    那么这是什么问题呢?我的正则表达式中是否有错误,或者记事本++中是否有错误?

    更新

    我已经删除了有问题的实际文件,并将其上传到 https://pastebin.com/w62E57U5。要重现该问题,请执行以下操作:
  • 从上面的链接下载文件并将其保存在硬盘上的某个位置(请勿将文本直接复制到Notepad ++中)。
  • 将文件加载到Notepad ++中。现在,光标在最上面的行中,并且没有任何选择。
  • 这是必不可少的:单击编辑-> EOL转换-> Unix(LF)。
  • 确认光标仍位于最上方的行(为空),并且未选择任何内容。
  • 打开“查找”对话框,选择设置,然后如上所述输入搜索字符串。
  • 单击“查找下一个”。
  • 注意,现在已经找到/选择了完整的文本。
  • 使“查找”窗口保持打开状态,删除文件的第三行(读取为“Funktionspaket(e):ML”)。不要只清空该行,而是要真正删除它,以便在前一行和后一行之间没有空行。
  • 再次将光标置于最上面的行(仍为空)中,并确保未选择任何内容。
  • 单击“查找下一个”。
  • 注意,正则表达式现在可以按预期运行。

  • 显然有人在愚弄我,对吧?

    最佳答案

    我认为关键是:您需要以^(行的开头)开始您的正则表达式。

    您原来的正则表达式变为:

    ^\n([^\n]+\n)+[^\n]+(Änderbar\:\ --[^\n]+\n)([^\n]+\n)+

    但是您可以使用以下方法简化它:
    ^\R(?:.+\R)+.+Änderbar: --.+\R(?:.+(?:\R|\z))+

    注意:勾选 . matches newline
    哪里:
  • \R匹配任何类型的换行符,无需更改EOL。
  • \z与文件的末尾匹配,如果不使用它,则在没有换行符的情况下就无法匹配文件的最后一行。
  • (?:...)是一个非捕获组,效率更高(当然,如果您不需要捕获)

  • 两者都适合您的2个样本文件。

    关于regex - Notepad++ /BOOST中的错误还是我的正则表达式中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58271998/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com