c# – 外观组中的条件在.NET正则表达式中如何工作?

前端之家收集整理的这篇文章主要介绍了c# – 外观组中的条件在.NET正则表达式中如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用正则表达式,特别是.NET风格的平衡匹配,我发现了一点,我意识到我不理解引擎的内部工作原理和我想的那样好.我会嘲笑我的模式为什么会这样做的任何输入!但拳头……

免责声明:这个问题纯粹是理论上的,这里获得的任何结果都不会被使用,或者在生产代码中被修改和使用来解析HTML.永远.我承诺.我确实害怕小马. =)

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

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

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

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

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

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

所以:如何环顾群体,在其中命名捕捉群体和条件一起玩?

谢谢!

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

解决方法

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

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

猜你在找的C#相关文章