当前位置: 首页 > 知识库问答 >
问题:

使用负后视的正则表达式在记事本中不起作用

宰鸿博
2023-03-14

我有一个源文件,其中包含数百次出现的字符串 flecha.jpgflecha1.jpg,但我需要查找任何其他.jpg图像的出现(即 casa.jpgmoto.jpg 等等)

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

(?<!flecha|flecha1).jpg

但是它不起作用!记事本简单地说它是一个无效的正则表达式。

我已经在其他地方尝试过正则表达式并且它有效,这里有一个例子,所以我想这是 NPP 处理正则表达式或回溯/前瞻语法的问题。

那么如何在 NPP 中实现相同的正则表达式结果呢?

如果有用的话,我用的是记事本版本6.3 Unicode

另外,如果你真的很善良,那么除了用可选数字(在本例中只有“1”)作为字符串的后缀之外,还有什么语法可以实现相同的功能?(即使它在核电站不起作用,只是想知道)。。。

我尝试了(?


共有3个答案

融焕
2023-03-14

你知道你只匹配(在消费的意义上)扩展名(.jpg)吗?我想你想匹配整个文件名,不是吗?这更容易用前瞻性方法来实现:

\b(?!flecha1?\b)\w+\.jpg

第一个\b将匹配锚定到名称的开头(假设它确实是我们正在查看的文件名)。然后(?!flecha1?\b)断言该名称不是flechaflcha1。完成后,\w继续并使用名称。然后\。jpg抓住扩展名完成比赛。

龙永思
2023-03-14
匿名用户

这里给出了在记事本(或任何具有相同限制的正则表达式引擎)中解决此限制的几种策略

记事本不支持使用可变长度的负查找断言,最好有一些变通方法。让我们考虑原始问题中的示例,但假设我们希望避免出现名为flecha的文件,该文件在flcha后有任意数字,在flecha前有任意字符。在这种情况下,使用可变长度负查找的正则表达式看起来像(?

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

>

  • 插入临时标记

    首先对您想要避免使用的实例执行查找和替换-在我们的例子中,是flecha[0-9]*\. jpg的实例。插入一个特殊的标记以形成一个不会出现在其他任何地方的模式。对于此示例,我们将在. jpg之前插入一个额外的.,假设… jpg没有出现在其他地方。所以我们这样做:

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

    替换为: $1.$2

    现在,您可以在文档中搜索所有其他< code >。jpg文件名,带有简单的正则表达式,如< code>\w \jpg或< code >(?

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

    (?

    分解:

    • (?

    这是一种快速(但不那么优雅)的解决方案,适用于您不希望匹配的图案具有少量可能长度的情况。

    例如,如果我们知道flecha后面最多只有三个数字,那么我们的正则表达式可以是:

    (?

  • 钦海荣
    2023-03-14

    记事本似乎没有实现可变长度的后视(这发生在一些工具上)。一种解决方法是使用多个固定长度的后视:

    (?<!flecha)(?<!flecha1)\.jpg
    

    如你所见,匹配是相同的。但这适用于npp。

    请注意,我转义了,因为您正在尝试匹配扩展,所以您想要的是文字。您使用的方式是通配符-可以是任何字符。

    关于额外的问题,不幸的是,由于我们不能有可变长度的后备,所以不可能有可选的后缀(数字)而不有多个后视。

     类似资料:
    • 我要匹配以下字符串: 包含unicode空格(不要问我为什么)<代码>/,\s*,/u在regex101中工作正常。 但是(?u),\s*,“在clojure中不起作用: 为什么会失败?

    • 在不提取字段的情况下,我想搜索不包含“country=$”的任何事件,即事件不能以“country=”结尾。我可以将其regex为“country=(?!$)”,但这仍然需要country出现在事件中,这不是我想要的。 示例:我的搜索: 在一个常规的regex解释器中,我已经用(?!(country=$))匹配了它就足够了,但是splunk不理解这一点,并且命中了所有事件。

    • 正则表达式非常简单: 这在Neo4j服务器web控制台中有效。我收到了预期的结果。 当我通过Java使用REST接口时,我必须将regex更改为:(添加了反斜杠)。我不明白为什么,但它确实有效(再次返回了预期结果)。 相同的正则表达式不适用于嵌入式Neo4j: 请注意 不会显示在错误日志中(至少在 Intellij 控制台上)。 更糟糕的是< code > "(?我)。* \ \ baaaaaaa

    • 问题内容: 我有一个正则表达式: 这应该与该字符串匹配并返回三个捕获(根据Rubular) 这是我的代码: 当有三个时,此打印输出1(组),所以我只能这样做,只会返回32。 问题答案: 调用查找匹配的 下一个 实例,如果没有更多实例,则返回false。尝试调用它三次,看看是否有所有预期的组。 为了澄清,正在尝试 在正则表达式中 找到第一个组 表达式 。您的正则表达式中只有一个这样的组表达式,因此永

    • 问题内容: 我和我的朋友正在尝试创建一种算法来计算输入的数字之后不会重复的数字(例如)。 感兴趣的代码是: 由于某种原因,即使将其设置为,也将其设置为。每个输出的结果将与输入具有相同的值。 这是什么问题,我们将如何更改逻辑,以便当数字中的数字重复时,检查器返回假? 问题答案: 考虑这些行 有一些问题。我认为您缺少牙套。和你忘了更新checker的时候matcher.find()是假的。我建议你改为

    • 我正在尝试使用正则表达式验证JSON字符串。从另一个帖子中找到了有效的正则表达式https://stackoverflow.com/a/3845829/7493427它使用regex中的DEFINE特性。但是我认为JRegex库不支持这个特性。这有什么办法吗? 我首先使用java.util.regex,然后发现JRegex库。但这也行不通。 因为测试json是有效的,所以我希望匹配,但我得到了一个