gpt4 book ai didi

c# - 环视组中的条件如何在 .NET 正则表达式中工作?

转载 作者:太空狗 更新时间:2023-10-29 20:35:23 25 4
gpt4 key购买 nike

玩正则表达式,尤其是 .NET 风格的平衡匹配,我意识到我并不像我认为的那样了解引擎的内部工作原理。我会 appriciate 任何关于为什么我的模式以他们的方式表现的输入!但是拳头...

免责声明:此题纯属理论题,此处得到的任何结果绝不会在生产代码中使用、修改和用于解析 HTML。曾经。我保证。我确实害怕小马。 =)

现在是我的问题。我将尝试匹配字母 A , 如果它前面没有 # .为了演示,我将始终使用字符串 ..A..#..A.. .在这里,第一个 A应该匹配。当然,使用 "A(?<!^.*#.*)" 是一项非常容易的任务。 ,但我希望在这里使用条件,因为它们可用于平衡匹配和其他很酷的事情。

我试过的是

"A(?<=^(#(?<q>)|[^#])*(?(q)(?!)))"

我的解释是:当引擎遇到“A”时,它返回到字符串的开头,如果字符是#,则为每个字符添加一个空匹配到捕获组 q。如果 q 包含匹配项,则它应该失败。我不明白的是为什么这个表达式与我的示例字符串中的两个 As 都匹配。

当我简单地删除 lookbehind 并匹配整个字符串时,这有效:

"^(#(?<q>)|[^#])*(?(q)(?!))A"

匹配整个字符串直到第一个 A,即使第一组的量词是贪婪的。在开头插入“#”也会导致匹配失败(根据需要)。

那么:look around groups、named capturing groups in them 和 conditionals 如何一起玩?

谢谢!

编辑: 这个问题可以在(?<=(?<q>)(?(q)(?!))). 中更容易地看到。 ,它不应该匹配任何字符,而是匹配所有内容。

最佳答案

就此而言,条件语句在平衡匹配或其他任何地方都没有那么有用。 ;) 平衡匹配通过使用命名的捕获组作为堆栈来工作;每次该组匹配某些内容时,匹配的文本就会被压入堆栈。还有用于弹出堆栈的特殊语法。这是一个很好的介绍:

http://blog.stevenlevithan.com/archives/balancing-groups

关于c# - 环视组中的条件如何在 .NET 正则表达式中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246664/

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