使用正则表达式,特别是.NET风格的平衡匹配,我发现了一点,我意识到我不理解引擎的内部工作原理和我想的那样好.我会嘲笑我的模式为什么会这样做的任何输入!但拳头……
免责声明:这个问题纯粹是理论上的,这里获得的任何结果都不会被使用,或者在生产代码中被修改和使用来解析HTML.永远.我承诺.我确实害怕小马. =)
现在我的问题.如果字母A不在#前面,我会尝试匹配字母A.为了演示,我总是使用字符串..A ..#.. A …这里,第一个A应该匹配.当然,使用“A(?<!^.*#.*)”这是一个非常简单的任务,但我希望在这里使用条件,因为它们可以用于平衡匹配和其他很酷的事情. 我试过的是
"A(?<=^(#(?<q>)|[^#])*(?(q)(?!)))"
我解释它的方式是:当引擎遇到“A”时,它会返回到字符串的开头,并且如果字符是#,则每个字符都会向捕获组q添加一个空匹配.如果q包含匹配,它应该失败.我不明白的是为什么这个表达式匹配我的示例字符串中的As.
当我简单地删除lookbehind并匹配整个字符串时,这有效:
"^(#(?<q>)|[^#])*(?(q)(?!))A"
匹配整个字符串直到第一个A,即使第一个组的量词是贪婪的.在开头插入“#”也会导致匹配失败(根据需要).
所以:如何环顾群体,在其中命名捕捉群体和条件一起玩?
谢谢!
编辑:这个问题可以更容易地在(?< =(?< q>)(?(q)(?!)))中看到,它不应该匹配任何字符,但匹配所有字符.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。