c#正则平衡组与递归匹配问题

云稀 2010-02-01 05:10:04
<div[^>]*>(((?<o>)<div[^>]*>|(?<-o>)</div>|(?:(?!</?div)[\s\S]))*)(?(o)(?!))</div>

(?:(?!</?div)[\s\S])

请问在第一行中和第二行部份,怎么理解?


...全文
266 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-08-09
  • 打赏
  • 举报
回复
再按我的理解说一下,
a((?<o>a)|(?<-o>c)|[^ac]+)+(?(o)(?!))c
平衡组的部分,还是不够深入了解。
再猜测一次把。
(?(o)(?!))
意思是,如果o分组捕获到,则执行(?!)表示失败。
如果<-o>分组捕获到,则o和-o都被移除堆栈,所以如果-o捕获到,则?(o)的结果是false。因为没写任何操作,则如果没捕获到,则不做任何处理,捕获到则执行(?!)。

咱们还是期待过客兄吧。或是一起看看他博客。
兔子-顾问 2010-08-09
  • 打赏
  • 举报
回复
仔细回味了一下当年思归用平衡组解决的一个问题,是说如何判断一个字符串是由数字和字母组成的,并且数字和字母都要存在,这是第一次见到过客说的广义平衡组。
数字和字母组成的,怎么写?[a-zA-Z0-9]+
但你无法限制数字或字母必须出现过。
当然,我们不用平衡组也能实现。比如js中支持的语法,断言
^(?![^0-9]*$)(?![^a-zA-Z]*$)[a-zA-Z0-9]+$
但也可以用做为很好的平衡组的例子。
^((?<a>[0-9])|(?<b>[a-zA-Z]))+(?(a)|(?!))(?(b)|(?!))$
数字分组为a,因为没有<-a>的分组,所以只要有<a>分组捕获即可(?(a))结果就是true
同理b分组捕获大小写字母
(?(a)|(?!))
表示如果分组a捕获到,则不做任何行为,如果没捕获到则表达式失败。


er..
更专业的讲解还是看过客的博客吧。
兔子-顾问 2010-08-09
  • 打赏
  • 举报
回复
(?:(?!</?div)[\s\S])
--------------------
(?:(?!</?div)[\s\S])
表示整体组合,并取消分组,不压入堆栈保存结果,目的是加快速度,减少内存分配和堆栈操作。
--------------------
(?!</?div)[\s\S]
--------------------
\s表示符号
\S表示非符号
符号或者非符号就表示所有字符,这样写的目的是不使用但行模式时,.无法匹配\n,这样就可以表示比.更完整的所有字符的含义。
--------------------
(?!</?div)
--------------------
这个是一个非常经典的思路,不知道是不是过客兄自创的,他自创了很多写法,都灰常好。
先不说这个,简化一下。
比如字符串为:abc
(?!c)
这表示什么?这表示一个位置,什么位置呢,就是后面一个字符不是c的位置,那么这将有3个位置被匹配到。
分别是a前面,b前面,和c后面。为什么有c后面?因为c后面不是没有字符,而是有一个特殊的正则标记$
所以c后面也被捕获。
(?!</div)
这个就捕获<div前面的所有位置

其实你的问题和平衡组没啥关系。平衡组,过客兄博客写的太清除了。我也很喜欢正则,给你说一下好了,我很喜欢简化掉例子中复杂的表达式。

还是abc的例子
概念我还是弄不清楚,反正就这么写。广义平衡组吧,貌似这么叫的。

a((?<o>a)|(?<-o>c)|[^ac]+)+(?(o)(?!))c

就是a或者c或者不是a,c之外的任意多个字符重复。a压入堆栈,c对应的弹出堆栈,如果有某个堆栈没有出栈,则放弃堆栈捕获只返回符合的堆栈。
结果就是捕获到abc。

如果是
ababcc
平衡组捕获到babc,其中入栈的是第二个元素a,出栈的是第一个出现的c,其他的字符由[^ac]+捕获到。不知道这是不是过客兄自己的独创,确实比我们当初那次,第一次见到思归用平衡组的写法要简单的多了。
十八道胡同 2010-02-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/lxcnn/archive/2009/08/03/4402808.aspx

(?:(?! </?div)[\s\S])
----
[\s\S]就是匹配全部字符,只匹配一个字符
/? 就是/可有可无
(?:(?! </?div)[\s\S])
匹配不是<div或者</div的第一个字符.
十八道胡同 2010-02-01
  • 打赏
  • 举报
回复
客客的blog讲的很清楚
lxcnn

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧