平衡可变长度lookbehind中的组[重复]

2023-12-07

TL;DR:在.NET 的lookbehinds 中使用捕获(特别是平衡组)会更改获得的捕获,尽管它不会产生任何影响。 .NET 的lookbehind 是什么破坏了预期的行为?

我试图找到一个答案这另一个问题,作为玩弄 .NET 平衡组的借口。但是,我无法让它们在可变长度的向后查找中工作。

首先,请注意,我并不打算有效地使用这个特定的解决方案。这更多是出于学术原因,因为我觉得可变长度lookbehind发生了一些我不知道的事情。并且知道将来当我实际上需要使用这样的东西来解决问题时,这可能会派上用场。

考虑这个输入:

~(a b (c) d (e f (g) h) i) j (k (l (m) n) p) q

目标是匹配括号内前面的所有字母~,无论内心有多深(所以一切都来自a to i)。我的尝试是检查后向查找中的正确位置,以便我可以在一次调用中获取所有字母Matches。这是我的模式:

(?<=~[(](?:[^()]*|(?<Depth>[(])|(?<-Depth>[)]))*)[a-z]

在回顾中我尝试找到一个~(,然后我使用命名组堆栈Depth计算无关的左括号。只要括号打开~(永远不会关闭,向后查找应该匹配。如果到达右括号,(?<-Depth>...)无法从堆栈中弹出任何内容,并且后向查找应该失败(也就是说,对于来自j)。不幸的是,这不起作用。相反,我匹配a, b, c, e, f, g and m。所以只有这些:

~(a b (c) _ (e f (g) _) _) _ (_ (_ (m) _) _) _

这似乎意味着一旦我关闭了一个括号,后向查找就无法匹配任何内容,unless我回到之前去过的最高嵌套层。

好吧,这可能只是意味着我的正则表达式有些奇怪,或者我没有正确理解平衡组。但后来我尝试了这个,没有向后看。我为每个字母创建了一个字符串,如下所示:

~(z b (c) d (e f (x) y) g) h (i (j (k) l) m) n
~(a z (c) d (e f (x) y) g) h (i (j (k) l) m) n
~(a b (z) d (e f (x) y) g) h (i (j (k) l) m) n
....
~(a b (c) d (e f (x) y) g) h (i (j (k) l) z) n
~(a b (c) d (e f (x) y) g) h (i (j (k) l) m) z

并在每一个上都使用了这个模式:

~[(](?:[^()]*|(?<Depth>[(])|(?<-Depth>[)]))*z

根据需要,所有情况都匹配,其中z替换之间的一个字母a and i之后的所有案例都失败了。

那么(可变长度)lookbehind 会做什么来打破平衡组的这种使用呢?我整个晚上都试图研究这个(并发现了类似的页面this one),但我在回顾中找不到这个的单一用途。

如果有人可以将我链接到一些有关 .NET 正则表达式引擎如何在内部处理 .NET 特定功能的深入信息,我也会很高兴。我发现这篇很棒的文章,但它似乎并没有进入(可变长度)lookbehinds,例如。


我想我明白了。
首先,正如我在一条评论中提到的,(?<=(?<A>.)(?<-A>.))从不匹配。
但后来我想,那又如何呢?(?<=(?<-A>.)(?<A>.))?确实匹配!
又如何呢(?<=(?<A>.)(?<A>.))?匹配对"12", A是捕获"1",如果我们看一下Captures集合,就是{"2", "1"}- 前两个,然后一个 - 这是相反的。
因此,在lookbehind内部时,.net从右到左匹配和捕获.

现在,我们怎样才能让它从左到右捕获呢?这真的很简单——我们可以使用前瞻来欺骗引擎:

(?<=(?=(?<A>.)(?<A>.))..)

应用于您的原始模式,我想出的最简单的选择是:

(?<=
    ~[(]
    (?=
        (?:
            [^()]
            |
            (?<Depth>[(])
            |
            (?<-Depth>[)])
        )*
        (?<=(\k<Prefix>))   # Make sure we matched until the current position
    )
    (?<Prefix>.*)           # This is captured BEFORE getting to the lookahead
)
[a-z]

这里的挑战是,现在平衡部分可能在任何地方结束,所以我们让它一直到达当前位置(类似于\G or \Z在这里会有用,但我不认为 .net 有这个功能)

这种行为很可能记录在某处,我会尝试查找它。

这是另一种方法。这个想法很简单 - .net 想要从右到左匹配?美好的!拿着它:
(tip: 从底部开始阅读- .net就是这么做的)

(?<=
    (?(Depth)(?!))  # 4. Finally, make sure there are no extra closed parentheses.
    ~\(
    (?>                     # (non backtracking)
        [^()]               # 3. Allow any other character
        |
        \( (?<-Depth>)?     # 2. When seeing an open paren, decreace depth.
                            #    Also allow excess parentheses: '~((((((a' is OK.
        |
        (?<Depth>  \) )     # 1. When seeing a closed paren, add to depth.
    )*
)
\w                          # Match your letter
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平衡可变长度lookbehind中的组[重复] 的相关文章

  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • 如何在 TeamCity 的 .NET 项目中包含解决方案目录之外的依赖项

    我的解决方案目录之外有类库 因此我在 sln 文件 SomeDependency csproj 中有这样的引用 在 VS 中一切正常 但在尝试构建我的解决方案时 TeamCity 失败了 我猜它复制了所有解决方案目录 因此关系不再存在 这是
  • 从字符串中提取电子邮件地址

    我有一个像这样的字符串 Francesco Renga lt email protected cdn cgi l email protection gt 我只需要提取电子邮件 即 电子邮件受保护 cdn cgi l email protec
  • 如何向 UWP 项目添加 .NET dll 引用?

    我有几个适用于 NETv4 x 的 NET dll 项目 我将版本更改为 4 6 1 并重新构建 没有出现问题 当我尝试从 UWP 项目向它们添加引用时 出现错误 项目的目标是 NETCore 而文件引用的目标是 NET框架 这不是受支持的
  • [程序名称].exe已停止工作

    我有一个基于 Framework 2 0 构建的 NET 应用程序 我已经为它构建了一个安装程序 并尝试在具有 3 5 的计算机上运行它 所有相关环境均在Windows 7上 该应用程序在我的开发机器上以 VS 调试模式完美运行 该机器也具
  • 如何使用 RSA-SHA1 算法对 xml 元素进行签名?

    我需要使用 RSA SHA1 算法签署 并最终验证 XML 文档的节点之一 w3 org 链接 https www w3 org TR xmlsec algorithms RSA SHA1 网址 http www w3 org 2000 0
  • .NET 正则表达式可匹配任何语言的任何类型的字母

    我可以使用哪种正则表达式来匹配 允许 任何语言的任何类型的字母 我需要匹配任何字母 包括任何变音符号 例如 并排除任何类型的符号 数学符号 货币符号 装饰符号 方框图字符等 和标点符号 我正在使用 ASP NET MVC 2 和 NET 4
  • 使用正则表达式定位响铃字符

    我注意到 Bell 有一个正则表达式字符 我却无法匹配 我读到了这个角色的内容维基百科 http en wikipedia org wiki Bell character 但我不明白如何在正则表达式中找到它
  • PHP 删除字符最后一个实例之前的所有内容

    有没有办法删除某个字符之前的所有内容 包括最后一个实例 我有多个字符串 其中包含 gt e g the gt cat gt sat gt on gt the gt mat welcome gt home 我需要对字符串进行格式化 以便它们变
  • Python正则表达式检查字符串是否包含任何单词

    我想搜索一个字符串并查看它是否包含以下任何单词 AB AG AS Ltd KB University 我在 javascript 中工作 var str Hello test AB var forbiddenwords new RegExp
  • C# 最小化所有打开的窗口

    我在论坛上看到了这个 C 代码 它最小化了所有打开的窗口 define MIN ALL 419 define MIN ALL UNDO 416 int main int argc char argv HWND lHwnd FindWindo
  • C# HTTP 请求解析器[重复]

    这个问题在这里已经有答案了 可能的重复 将原始 HTTP 请求转换为 HTTPWebRequest 对象 https stackoverflow com questions 318506 converting raw http reques
  • PHP 电子邮件验证[重复]

    这个问题在这里已经有答案了 For PHP最好的电子邮件验证方法是什么preg NOT ereg因为它是已弃用 删除 I don t需要检查该网站是否存在 这不像最高安全性 我找到了很多方法ereg但它们 显然 不是好的做法 我建议你使用F
  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 包恢复失败。回滚包更改 - Serilog.AspNetCore

    我有一个 asp net Core 项目 我正在尝试向其中添加一个记录器 我选择了我在其他项目中使用过的 SeriLog 但是当我尝试添加 Serilog AspNetCore 我得到的软件包版本 2 0 0 包恢复失败 回滚 后端 的包更
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work

随机推荐

  • MeteorJS Mobile 构建:rooturl 始终为 10.0.2.2:3000,而不是构建脚本期间指定的真实服务器

    几天来我在meteorjs和移动构建方面遇到了一些问题 3 个不同的应用程序均出现此问题 我使用 np 脚本和此类脚本构建应用程序 usr bin env bash if z npm package config mongourl then
  • Spring Boot JPA 使用 Hibernate 在 TABLE 中插入大写名称

    我有一个表实体映射为 Entity public class ItemsToRegister implements Serializable Id Column name ID ITEM TO REGISTER GeneratedValue
  • 如何在php中找到这个数组的值?

    我有一个数组 如何获取该数组的值 Array 0 gt Array 0 gt raj 1 gt 1234 2 gt gov 1 gt Array 0 gt some 1 gt 1234 2 gt prv 2 gt Array 0 gt la
  • 为什么切片不起作用?

    我是 Javascript 新手 我正在尝试编写一个 chrome 扩展 对于扩展 如果用户输入一个字符串 我希望前两个字符被切掉 目前 我有 if text charAt 0 text slice 0 2 chrome tabs crea
  • JSON.NET 和 nHibernate 集合的延迟加载

    有人将 JSON NET 与 nHibernate 一起使用吗 我注意到当我尝试加载带有子集合的类时出现错误 我遇到了同样的问题 所以我尝试使用 Liedman的代码 但是GetSerializableMembers 从未被要求提供代理参考
  • 延迟但不禁用 iPhone 自动锁定

    我目前有一个非常简单的应用程序 唯一的交互就是摇动 iPhone 然而 由于 iPhone 没有收到任何触摸事件 屏幕最终会变暗并自动锁定 我想知道是否有办法重置震动时自动锁定超时 我知道要完全禁用自动锁定 我会这样做 UIApplicat
  • 如何使用正则表达式查找特定匹配并将它们放入字符串数组中?

    我有一个 HTML 文件 我正在尝试从中提取数据 我使用的正则表达式是
  • 删除 arrayList 中的元素后出现 InvalidOperationException [重复]

    这个问题在这里已经有答案了 您好 我正在尝试从 arrayList 中删除所有可被 2 整除的数字 问题是 删除一个元素后 我得到一个 InvalidOperationException private ArrayList RemoveDi
  • 如何从文本文件中读取数百万行并快速插入表中

    我已经经历了快速向 SQL Server 插入 200 万行链接并发现我可以通过使用批量插入来做到这一点 所以我试图创建数据表 代码如下 但由于这是一个巨大的文件 超过 300K 行 我得到一个OutOfMemoryEexception在我
  • Y86汇编全局变量

    我正在努力让全局变量为我的 Y86 作业正常工作 不幸的是 我们提供的唯一示例是 IA 32 组件 我过去几个小时一直在寻找 但没有结果 这是我知道的非常基础的知识 但我在 Y86 完全是新手 我 声明 我的变量如下 align 4 x l
  • MySQL-自动递减值

    假设我有一个表 像这样 id 是自动递增的 id col1 col2 1 msg msg 2 lol lol2 3 xxx x 现在 我想删除第 2 行 我得到这样的结果 id col1 col2 1 msg msg 3 xxx x 问题是
  • 如何将某些内容注入到表单中

    从play 2 4 0开始 我们可以使用DI框架 我正在尝试在我的应用程序中使用 DI 我将 jpa 查找器从模型类上的静态方法移至注入控制器的服务层中的方法 我的主要问题是我有一些带有验证方法的表单 并且在我的验证方法中我使用了一些查找器
  • 让 ReSharper 尊重您对代码顺序的偏好

    与我的另一个问题相关 布局 C 类的最佳方式是什么 ReSharper 中有没有办法定义您希望成员的顺序 以便 ReSharper 维护它 From 这个答案 检查下类型成员布局 in Options 在下面C 节点 这并不简单 但可以更改
  • 如何使用 R 创建分组条形图[重复]

    这个问题在这里已经有答案了 我正在尝试使用 R 创建分组条形图 我尝试使用以下代码来创建一个简单的条形图 x c 99 9 104 67 86 53 83 29 127 31 179 86 74 80 100 150 68 18 81 47
  • Delphi 中重载记录的隐式转换作为 const 数组中的参数

    作为 Delphi 7 转换的一部分 我们摆脱了 ShortString 我想让它尽可能轻松 所以我们认为我们可以将 ShortString 更改为一些以相同方式起作用的记录 这是它的声明方式 还有更多内容 但这是基本结构 概述了问题 TS
  • 用ANTLR解析Java代码“需求概念”

    我正在尝试使用 ANTLR 进行程序编译 我使用 Java 编程语言作为目标 问题的核心是开发 Intent Regornizer 来纠正错误并改进源代码 如果源代码不符合 语法 在 ANTLR 的教程和书籍上 我看到如何编译一个简单的代码
  • 订单状态完成时更改购买特定产品的用户角色

    因此 我帮助某人启动了一个网站 当有人购买特定产品时 他们想要折扣产品 我找到了一个解决方案并实施了它 它在网站启动时发挥了作用 并且不再改变客户在购买产品时的角色 我试图获得 Woothemes 的支持 但他们不支持定制 并希望他们购买
  • 将存储过程结果导出到表中

    我有以下存储过程 可以根据某些条件生成 SQL 语句 我希望 SQL 语句也将实际结果返回到表中 CREATE TABLE dbo Rejects Report Year varchar 100 NULL COS Country Code
  • 通过无障碍服务禁用热词检测

    我创建了一个可访问的服务来保存每条 toast 消息 但现在如果我激活我的服务 Google Now 中的热词检测将被禁用 Logcat 显示 W HotwordState suspended 11001001000000 在 Google
  • 平衡可变长度lookbehind中的组[重复]

    这个问题在这里已经有答案了 TL DR 在 NET 的lookbehinds 中使用捕获 特别是平衡组 会更改获得的捕获 尽管它不会产生任何影响 NET 的lookbehind 是什么破坏了预期的行为 我试图找到一个答案这另一个问题 作为玩