如题,非常不好理解。
栈是肯定知道的。但是配上她的语法,我头都晕啦
http://deerchao.net/tutorials/regex/regex.htm#escape
然后找到“ 平衡组/递归匹配 ”
这里应该怎样理解,这个平衡组有什么意义呢?
下面的是msdn的说明:这里还出现<name1-name2>而不是<-name2>,这个也是正确的吗?
(?<name1-name2>子表达式)
定义平衡组定义。
(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$
“3+2^((1-3)*(3-1))”中的“((1-3)*(3-1))”
栈是肯定知道的。但是配上她的语法,我头都晕啦
http://deerchao.net/tutorials/regex/regex.htm#escape
然后找到“ 平衡组/递归匹配 ”
这里应该怎样理解,这个平衡组有什么意义呢?
下面的是msdn的说明:这里还出现<name1-name2>而不是<-name2>,这个也是正确的吗?
(?<name1-name2>子表达式)
定义平衡组定义。
(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$
“3+2^((1-3)*(3-1))”中的“((1-3)*(3-1))”
解决方案 »
- winform 中textbox的TextChanged事件 如何才能输入一个字符就触发一次?
- 请大家帮忙。我用VS2005开发了一个页面,在我双击页面按钮的时候,后台的C#代码和页面的代码是混在一起的,请问如何设置才能把他们分开。
- 请问有没有用于PDA开发的文字识别的组件推荐?
- 在程式中如何写自动发邮件的代码
- 在dateGirdView中輸入字符長和數據庫中字段長度不符合
- 菜鸟求教:不知错在何处
- 莱鸟求救!请问这个存储过程如何写?在线等!急
- 毕业生:请各位给点意见
- 如何修改progressBar 中的precent成员的数据类型为float
- VSIDE环境不稳定?
- aspx动态网站,如何转成静态html?
- Form的键盘事件失效
这个正则好像很复杂,应该怎样来读
就我简单的理解
()
分组你知道把,分组的内容要创建堆栈来保存。
平衡组不过就是增加了一个出栈的功能,简单说,
(?<open>)分组捕获到内容
(?<任意字符-open>)分组捕获到,则将open弹出分组
最终通过(?(opne))检查open是否有捕获到,因为(?<任意字符-open>)如果和open的次数一样出现,则最终应该没有被捕获的open,所以不会有成功捕获。以达到检查open和-open的分组是否个数一样的目的。这就是平衡组的目的和实现。你写的正好是过客所说的狭义平衡组。不知道你明白没,反正我觉得我这样说法,比较简单。
这个很简单。不过是复杂点,如果需要,一会解释儿子来闹了。
我不用open这个名字也是可以的吧。怎么个个都是用open的呢。
<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>
这个不是找到最内层的div吗?
就
<div[^>]*>[^<>] 就表明中间是不能有html标签了
<div>
name:<span>xxxx</span>
age:<span>23</span>
</div>
在这里只匹配
<div></div>
<div/><div></div></div>
我就不知道这个平衡组有什么用。
好像他找html标签也是不能一对对找出来的
(?'Close-Open'expression) 可以简写为 (?'-Open'expression)
它与(?'Open'expression)是对应的(?'Open'expression)匹配成功一次就相当于入栈,(?'-Open'expression)匹配成功一次就相当于出栈
比如(a+(b+c))
(?'Open'\() 匹配的是开括弧
(?'-Open'\)) 匹配的是闭括弧
匹配“a”前的“(”入栈,再匹配“b”前的“(”入栈,接着匹配“c”后的两个“)”分别出栈,此时栈内是空的,也就表标入栈和出栈的次数是一致的,也就是起始标志“(”和结束标志“)”是配对出现的而如果源字符串换成:((a+(b+c))
由于第一个“(”没有与之配对的“)”,入栈次数与出栈次数不同,栈内还有数据,也就表示不配对,在位置0位是匹配不成功的楼主所给的正则不易理解,也不易构造,不适合所有情况,换成下面的写法就容易理解多了
string test = "(a+(b+c))+(d+e)";
Regex reg = new Regex(@"\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}更详细的可以参考我的博客
.NET正则基础之——平衡组
\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
第一个与第二个有什么差别呢?
我的目的也是一碰到(就压栈,括号之间可以有n个非()的字符,之后一碰到),就弹栈,但是
我用第一个匹配(a+(b+c))+(d+e) ,第一个括号是取不出来的,
(b+c),与(d+e)。
我也在你的博客里看。笨啊,没能那么快理解。
广义平衡组的目的是为了匹配成对出现的子串,多用于html代码中的标签匹配Open就是命名捕获组的name,随意起,只要(?<name>exp)和(?<-name>exp)对应上就可以先看下我的博客吧,有不清楚的地方可以提出来
但是他匹配层次性结构的那些部分呢?
(a+(b+c))+(d+e)
我可以将()看成html标签,
但是他也只是找到
(a+(b+c))
(d+e)
而
(b+c)没找出来。
不知道是不是这个意思。
如果用到div里 就是 将所有div的innerhtml取出来吗?
写得太好啦,我还没看完。回家再看。。学习得太多啦
表示匹配次数的就是量词,如
?、*、+、{m,n}、{m,}等等
\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
构成一个平衡组的几部分
1、表达式的开始,起始标记,此处为“\(”
2、入栈捕获组,此处为(?<Open>\()
3、出栈捕获组,此处为(?<-Open>\))
4、除需入栈或出栈子表达式所匹配内容之外的字符,此处为[^()]
5、是否配对的判断,固定为(?(Open)(?!))
6、表达式的结束,结束标记,此处为“\)”
放在一起,OK,一个平衡组已经完成了,接下来的就是一些优化工作了这是单字符的,对于子符组的,比如匹配<div>...</div>嵌套结构的,其它都没什么好说的,只有
4、除需入栈或出栈子表达式所匹配内容之外的字符,此处为(?:(?!</?div\b).)
组成的正则就是
(?is)<div[^>]*>(?><div[^>]*>(?<o>)|</div>(?<-o>)|(?:(?!</?div\b).)*)*(?(o)(?!))</div>
绝大多数情况下,这是没有问题的但是除非你真的理解每一个细节,否则不要这样去拼平衡组,因为你并不知道这样做是否会有潜在的陷阱