社区
C#
帖子详情
c#正则平衡组与递归匹配问题
云稀
2010-02-01 05:10:04
<div[^>]*>(((?<o>)<div[^>]*>|(?<-o>)</div>|(?:(?!</?div)[\s\S]))*)(?(o)(?!))</div>
(?:(?!</?div)[\s\S])
请问在第一行中和第二行部份,怎么理解?
...全文
262
6
打赏
收藏
c#正则平衡组与递归匹配问题
]*>(((?)]*>|(?)|(?:(?!</?div)[\s\S]))*)(?(o)(?!)) (?:(?!</?div)[\s\S]) 请问在第一行中和第二行部份,怎么理解?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
C#
正则
表达式的
递归
匹配
分析
在
C#
程序设计中经常会遇到这样的需求,要求
匹配
出成对的小括号里的内容,但是一般
正则
表达式中的 ?R 的语法似乎在
C#
中不被支持, 经过一番查找与测试,终于找到以下一段描述 /( 应该是 \( 不是用 /转义而是用 \来...
关于
C#
正则
表达式大全
C#
正则
表达式是.NET框架中用于处理文本模式
匹配
和搜索的强大工具。它允许开发者在
C#
程序中执行复杂的文本处理任务,如数据验证、提取、替换和分割。
正则
表达式在
C#
中主要通过`System.Text.RegularExpressions`命名...
C#
正则
表达式基础教程.doc
C#
正则
表达式是.NET框架中用于处理文本模式
匹配
和搜索的强大工具。这篇基础教程旨在帮助初学者理解和掌握
正则
表达式的...继续深入学习高级特性,如条件
匹配
、
递归
和
平衡
组,将使你在处理复杂文本模式时更加得心应手。
C#
正则
表达式 20分钟 从入门到精通
在IT领域,
正则
表达式(Regular Expression)是一种强大的文本处理工具,用于高效地搜索、
匹配
、替换字符串。对于
C#
开发者来说,掌握
正则
表达式是提高代码质量和效率的关键。"
C#
正则
表达式 20分钟 从入门到精通"这...
C#
计算器(
正则
实现)
在本项目中,"
C#
计算器(
正则
实现)"是一个使用
C#
编程语言构建的计算器应用程序,它利用
正则
表达式技术来处理和验证用户的输入,确保输入的计算公式合法,并能正确处理括号、乘除运算以及优先级
问题
。下面我们将详细...
C#
111,120
社区成员
642,545
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章