查看组中的条件如何在.NET正则表达式中工作?

玩弄正则表达式,特别是.NET风格的平衡匹配,我意识到我并不了解引擎的内部运作,就像我以前所做的那样好。 我会为了我的模式为什么会像他们那样行事而提出任何意见! 但拳头...

免责声明:这个问题纯粹是理论上的,在这里获得的任何结果将永远不会被使用或修改,并在生产代码中用于解析HTML。 永远。 我承诺。 我担心小马。 =)

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

我试过的是

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

我解释它的方式是:当引擎遇到“A”时,它返回到字符串的开始处,并且如果字符是#,则对于每个字符向捕获组q添加空匹配。 那么如果q包含一个匹配,它就会失败。 我不明白的是为什么这个表达式与我的示例字符串中的As匹配。

当我简单地删除后视图并匹配整个字符串时,这将起作用:

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

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

那么,如何看看周围的群体,将它们命名为捕获组和条件共同播放?

谢谢!

编辑:(?<=(?<q>)(?(q)(?!))).可以更容易地看到此问题(?<=(?<q>)(?(q)(?!))). ,它不应该匹配任何字符,但匹配一切。


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

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

链接地址: http://www.djcxy.com/p/2083.html

上一篇: How do conditionals in lookaround groups work in .NET regex?

下一篇: Is there algorithm for sorting array of strings for GPU?