查看组中的条件如何在.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?