正则表达式仅捕获匹配中捕获组的最后一个实例

2024-02-02

我有以下两种不同语言的正则表达式,它们产生相同的奇怪结果(javaScript 和 Flash)。我想知道的不是如何解决它,而是为什么会发生这种行为?

正则表达式:

\[(\\{2}|\\\]|[^\]])*\]

这里的目标是匹配括号内的字符串,并确保我不会停在转义括号处。

如果我有文本输入[abcdefg]它是正确匹配的,但作为捕获组的一部分返回的唯一内容是g,正如我所期望的那样abcdefg。如果我将表达式更改为\[((?:\\{2}|\\\]|[^\]])*)\],然后我就得到了我想要的结果。

那么为什么会发生这种情况呢?这在其他语言中是否一致?

note:将表达式简化为\[([^\]])*\]产生同样的问题。


不管问题如何,ActionScript 和 JavaScript 应该始终产生相同的结果,因为它们都实现了 ECMAScript(或其超集,但对于正则表达式,它们不应该不一致)。

但是,是的,这会发生在任何语言(或者更确切地说任何正则表达式风格)中。原因是您正在重复捕获组。让我们举一个更简单的例子:匹配(.)*反对abc。所以我们要重复的是(.)。第一次尝试,引擎进入组,匹配a with .,离开该组并捕获a。直到现在量词才开始起作用并重复整个过程。于是我们再次进组,匹配并捕获b。此捕获会覆盖前一个捕获,因此\1现在包含b。第三次重复也是如此:捕获将被覆盖c.

我不知道有什么行为不同的正则表达式风格,唯一可以让您访问所有以前的捕获(而不是仅仅覆盖它们)的是 .NET。

解决方案是 p.s.w.g.建议的。将重复所需的分组设置为非捕获(这将提高性能,因为您无论如何都不需要所有捕获和覆盖)并将整个内容包装在一个新组中。不过,您的表达式有一个小缺陷:您需要在否定字符类中包含反斜杠。否则,回溯可能会给你一个匹配[abc\]。因此,这里有一个可以按您的预期工作的表达式:

\[((?:\\{2}|\\\]|[^\]\\])*)\]

(不幸的是,它没有显示捕获,但它表明它在所有情况下都给出了正确的匹配)

请注意,您的表达式不允许使用其他转义序列。特别是单个\,后面跟着除了 a 以外的任何内容]会导致你的模式失败。如果这不是您想要的,您可以使用:

\[((?:\\.|[^\]\\])*)\]

性能可以进一步提高“展开循环” https://stackoverflow.com/a/17043605/1633117技术:

\[([^\]\\]*(?:\\.[^\]\\]*)*)\]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式仅捕获匹配中捕获组的最后一个实例 的相关文章

随机推荐

  • 是否可以在 El Capitan 上运行 Xcode 6.3?

    我真的很想尝试 El Capitan 但我不知道是否可以在其上运行旧的 Xcode 因为它现在对我来说至关重要 有人尝试过吗 在终端上运行此命令 Applications Xcode app Contents MacOS Xcode dev
  • Visual Studio 操作系统的条件编译

    我知道有一种方法可以有条件地编译目标框架 例如 if net461 elif 但是有没有一种方法可以针对特定操作系统进行条件编译 像目标 os MAC或目标 os win 如果有人可以指导我如何实现它的文档或教程 第2部分 另外 有没有办法
  • Spring 注释:使用 thymeleaf 对 bean 内部对象属性进行表单验证

    Thymeleaf 有没有办法验证 bean 对象属性中的属性 考虑一下我们确实有一个 Department 类 如下所示 public class Departement Id GeneratedValue strategy Genera
  • 如何获取Web应用程序服务的使用指标数据?

    我正在尝试执行 REST API 以从部署在 Azure 上的 Web 应用程序获取使用指标数据 Hi 我正在尝试执行 REST API 以从部署在 Azure 上的 Web 应用程序获取使用指标数据 https management az
  • php随机名称

    HI 为文件夹创建随机名称的最佳方法是什么 它将用于存储文档的文件夹名称 但是将创建大量文件夹 因此如果可能的话 每次都需要唯一 长度应该在 7 个字符左右 您也可以尝试 PHP 的uniqid http us php net manual
  • ASP.NET WebAPI 将 urlencoded 正文中的空字符串作为 null 传递

    我有一个简单的 ApiController public HttpResponseMessage Put int orderid FromBody Order order Do something useful with order Not
  • EF4 Code First、TDD、CRUD 和事务

    过去 我在创建数据访问 存储库代码时为简单的 CRUD 操作编写了单元测试 如下所示 using var connection new WhateverConnection connectionString connection Open
  • PHP cURL 内容类型未设置

    我想连接一个简单的网络服务 为了发布一些XML 这将在网络服务端正确进行 我需要准备一个正确的请求 我在用cURL对于这样的 try ch curl init if FALSE ch throw new Exception failed t
  • 我该怎么做才能在 WordPress 中获得实际的准备好的语句

    我的公司希望在他们的网站上使用 WordPress 我主要关心的是准备好的语句的使用 根据this https wordpress stackexchange com a 139431 我自己难以置信地阅读了源代码 WordPress 清理
  • 无法将源类型转换为目标类型

    我已经让这个子类实现了我的接口 并且在满足合同方面没有错误 但是 当我尝试在子类的构造函数中设置当前会话时 当它尝试将变量类型与 GetCurrentSession 返回的类型进行比较时 我收到此编译时错误 无法将源类型 IAPISessi
  • SQL Server 2000 - 跳出循环

    我不擅长 SQL Server 2000 我有一个以逗号分隔的 id 列表 我需要查看该 ID 是否存在于表中 如果是这样 我想跳出循环 并将该 ID 保存在可以在存储过程中使用的变量中 这就是我现在正在尝试的 DECLARE coreID
  • 如何使用 std::atomic 实现可重用的线程屏障

    我有 N 个线程执行各种任务 这些线程必须定期与线程屏障同步 如下图所示 有 3 个线程和 8 个任务 表示时间屏障 所有线程必须等到8个任务完成才能再次启动 Thread 1 task1 task6 wait taskB Thread 2
  • 如何一个接一个地运行参数化作业(没有参数)

    我在 Jenkins 有一份工作 有 2 个参数 我想运行另一个没有参数的计划 并从该计划中根据需要多次启动现有计划 新计划需要安排每 15 分钟运行一次 将由 Jenkins 的调度程序选项完成 该计划的代码将 连接到数据库 获取所需的记
  • 如何进行字段枚举迁移 yii2

    我做了字段ENUM 当我使用时结果是错误的yii migrate up在 CMD 窗口上 public function up tableOptions null if this gt db gt driverName mysql tabl
  • 在 c 中使用 malloc 实现堆栈 [初学者]

    出于学习目的 我正在用 c 语言实现一个堆栈及其函数 我添加了一些小的附加功能来第一次使用 malloc 并尝试正确理解它 我编写了一个最初创建堆栈结构的函数 该函数的返回值是一个具有已分配内存的新结构 在返回值应该是结构的函数中处理 ma
  • 如何在 emacs-ess 中的 R 会话之间切换?

    我在 Emacs ESS 中打开了两个会话 一个在我的桌面上 另一个在使用 trapmp 的服务器上 我如何告诉 ESS 使用哪个会话 嗯 我用 M x ess switch process 一直在 Emacs 内的 本地 R 会话之间切换
  • 无法读取 Zsh 历史记录的时间戳

    Problem 了解以下时间戳 1241036430 在 history 1241036336 0 vim zshrc 1241036379 0 vim bin HideTopBar 1241036421 0 ls 1241036430 0
  • Scala fat jar 中的 ExecutionInterceptorChain 中缺少 AWS SDK 执行拦截器

    我对 scala java sbt 相当陌生 这是我第一次调试通过 sbt 在 scala 中运行的代码与从编译的 jar 运行的相同代码之间的差异 我有一些 Scala 代码 它利用 AWS Java SDK 发出一些 S3 请求 当我使
  • 使用 p4merge 作为 git diff 工具

    I use windows 7 我想用p4merge作为 Git 差异 合并工具 我跟随本文 https danlimerick wordpress com 2011 06 19 git for window tip use p4merge
  • 正则表达式仅捕获匹配中捕获组的最后一个实例

    我有以下两种不同语言的正则表达式 它们产生相同的奇怪结果 javaScript 和 Flash 我想知道的不是如何解决它 而是为什么会发生这种行为 正则表达式 2 这里的目标是匹配括号内的字符串 并确保我不会停在转义括号处 如果我有文本输入