使用负面lookbehind的正则表达式在Notepad ++中不起作用

Die*_*oDD 15 regex notepad++ negative-lookbehind regex-lookarounds

我有数以百计的字符串的出现的源文件flecha.jpgflecha1.jpg,但我需要找到其他的事件.jpg图像(即casa.jpg,moto.jpg,等等)

我试过使用带有负向lookbehind的正则表达式,如下所示:

(?<!flecha|flecha1).jpg
Run Code Online (Sandbox Code Playgroud)

但它不起作用!Notepad ++只是说它是一个无效的正则表达式.

我在其他地方尝试了正则表达式并且它有效,这是一个例子,所以我猜这是NPP处理正则表达式或者lookbehinds/lookaheads语法的问题.

那么我如何才能在NPP中获得相同的正则表达式结果呢?

如果有用,我使用Notepad ++版本6.3 Unicode

另外,如果你很善良,那么实现同样的东西的语法是什么,但可选的数字(在这种情况下只有'1')作为我的字符串的后缀?(即使它在NPP中不起作用,只是为了知道)......

我试过(?<!flecha[1]?).jpg但它不起作用.它应该与其他正则表达式相同,请参见此处(RegExr)

acd*_*ior 16

Notepad ++似乎没有实现可变长度的后视(这在某些工具中会发生).解决方法是使用多个固定长度的后视:

(?<!flecha)(?<!flecha1)\.jpg
Run Code Online (Sandbox Code Playgroud)

你可以检查一下,比赛是一样的.但这适用于npp.

注意我逃脱了.,因为你试图匹配扩展,你想要的是文字..你的方式,它是一个通配符 - 可能是任何角色.

关于额外的问题,不幸的是,由于我们不能有可变长度的后视镜,因此不可能有可选的后缀(数字)而不需要多个后视镜.

  • @acdcjunior 您可能想在答案中添加有关使用 Boost 的内容。 (2认同)

Jos*_*hee 6

解决Notepad ++中可变长度负向后看限制的问题

这里给出了几种在Notepad ++(或具有相同限制的正则表达式引擎)中解决此限制的策略。

定义问题

Notepad ++不支持使用可变长度否定式后向断言,最好有一些解决方法。让我们考虑在原来的问题的例子,但假设我们要避免命名文件的出现flecha任何数量的后位flecha,并与之前的任何字符flecha。在这种情况下,使用可变长度负向后方的正则表达式看起来像(?<!flecha[0-9]*)\.jpg

在此示例中我们希望匹配的字符串

  • flecha.jpg
  • flecha1.jpg
  • flecha00501275696.jpg
  • aflecha.jpg
  • img_flecha9.jpg
  • abcflecha556677.jpg

策略

  1. 插入临时标记

    首先,在您要避免使用的实例上执行查找和替换-在本例中是的实例flecha[0-9]*\.jpg。插入特殊的标记以形成在其他任何地方都不会出现的图案。对于此示例,我们将.在之前插入一个额外的字符.jpg,前提是该..jpg字符未在其他位置出现。因此,我们这样做:

    找: (flecha[0-9]*)(\.jpg)

    用。。。来代替: $1.$2

    现在,您可以.jpg使用简单的正则表达式(例如\w+\.jpg或)在文档中搜索所有其他文件名,(?<!\.)\.jpg然后对它们进行处理。当你完成后,做最后的查找和替换操作,你替换的所有实例..jpg.jpg,删除临时标记。

  2. 使用否定的超前断言

    否定的超前断言可用于确保您不匹配不需要的文件名:

    (?<!\S)(?!\S*flecha\d*\.jpg)\S+\.jpg

    分解:

    • (?<!\S) 通过断言匹配前面没有非空格字符,确保匹配从文件名的开头而不是中间开始。
    • (?!\S*flecha\d*\.jpg) 确保匹配的任何内容都不包含我们要避免的模式
    • \S+\.jpg实际上是匹配的内容-一串非空格字符,后跟.jpg
  3. 使用多个固定长度的负向后查找

    对于您不希望匹配的模式具有少量可能的长度的情况,这是一种快速(但不太优雅)的解决方案。

    例如,如果我们知道flecha后面最多跟三位数,那么我们的正则表达式可能是:

    (?<!flecha)(?<!flecha[0-9])(?<!flecha[0-9][0-9])(?<!flecha[0-9][0-9][0-9])\.jpg