`
lovnet
  • 浏览: 6710805 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C#正则表达式(4):平衡组,递归匹配

 
阅读更多

看到平衡组,递归匹配这样的太充满术语性的名词又要头大了啊.其实简单点讲就是怎么去匹配那些互相匹配并且互相嵌套的字符对.

比如(),[],{}这样的配对的括号.如果你写代码时某个函数很长很长,那些嵌套的{}会把你搞晕了,不知道哪个配哪个了啊.那编译时人家编译器怎么知道呢.它就是通过类似平衡组的理论去识别.还有html,xml里面会有一堆<>这样的尖括号,如果不知道怎么去匹配配对的<>那肯定就乱套了.这里同样也用到平衡组类似的理论

先来讲点C#栈(Stack)的知识

那怎么才能去正确的匹配呢.很多大学课程里学数据结构这门课时可能会有这样的一个习题,就是有一个字符串里面有数字和算术操作符和括号.怎么把它解析出来当成算术表达式并得到结果.比如string str = "(3+4)*(9-5) - 2";怎么把它解析出来并算出结果.要实现这样的目的最简单的思路就是用栈这种数据结构.它是后进后出的一种结构.往栈中加入元素叫入栈,

从栈中删除元素叫出栈.假如传入字符'('则入栈,传入字符')'时不仅不入栈,还把之前的'('给删除掉.用C#的代码可以这样写

char input = '(';

Stack<char> stack = new Stack<char>();

if (input == '(')

stack.Push(input);

if (input == ')')

stack.Pop();

if (stack.Count == 0) //判断栈里面的元素是否为空

return true;

else

return false;

你可能奇怪在这里为啥讲这么跟正则表达式无关的东东.其实不是无关,而是很相关.你用平衡组,递归匹配能实现的功能,也同样能通过上面说的这种Stack来写代码来实现.只不过比较复杂一点.比如要加上些循环判断.而正则表达式里也肯定同样用到了栈,只不过封装了,你看不到.

平衡组,递归匹配

正则表达式里是这样用到栈的

(?'group'exp) 这其实就是前面讲的给一个分组命名,exp是一个字符串,用括号括起来就成一个分组了,group就是组名.只是它除了起命名的作用外,后台的操作就是把exp入栈

假如exp是左括号即(?'group'\(),则它的操作实际上和前面的代码if (input == '(') stack.Push(input); 一样

(?'-group'exp) 这里多了个-表示出栈.假如exp是右括号)即(?'-group'\))则它的操作和前面的代码if (input == ')') stack.Pop();一样.把exp出栈

(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分.其实这里yes和no可以去年一个

往往是去掉yes,就留下no而no也基本上不做其他操作,只是返回个表示匹配成功或失败的标志.这里用(?!)来表示匹配失败.前面有讲过零宽断言.它就是一种特殊的断言.

所以我们大部分时候的是这样用

(?(group)(?!) 它的意思和上面的代码一样.if (stack.Count == 0) //判断栈里面的元素为空

return true;

else

return false;

在这里举个比较简单的例子.要假如有一字符串.要匹配其中以第一个左尖括号后面开始出现的尖括号对<>里的内容

string source = "**<a<b<arwen>c>other>**";

string pattern = @"[^<>]* #匹配任何非尖括号的字符

(?'group'<) #匹配<并且入栈

[^<>]* #匹配任意非尖括号的字符

(?'-group'>) #匹配>并且出栈

[^<>]* #匹配任意非尖括号的字符

(?(group)(?!)) #判断栈中是否为空,为空则匹配成功,否则失败

";

Console.WriteLine(Regex.Match(source, pattern,RegexOptions.IgnorePatternWhitespace).Value);

结果是

b<arwen>c

分享到:
评论

相关推荐

    正则表达式--递归匹配与非贪婪匹配

    1. 表达式的递归匹配  有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况。比如,使用表达式 "\( [^)]* \)" 或者 "\( .*? \)" 可以匹配一对小括号。但是如果括号内还嵌有一层括号的话 ,如 "( ( ) )...

    正则表达式(学习的好资料)

    好东西 都是好东西咧 里面包括 C#中的常用正则表达式总结 javascript 验证url的正则表达式 JavaScript中的正则表达式学习1-2 JS与正则式强化训练作业 ...正则表达式--递归匹配与非贪婪匹配 正则式测试工具 等等等等

    JS正则表达式葵花宝典

    javascript 验证url的正则表达式. 经典正则表达式. 正则表达式--递归匹配与非贪婪匹配

    正则表达式转换为NFA(Regex to NFA).jar

    用JAVA写的一个将正则表达式转换为NFA的代码,基于Thompson算法的思想,递归构建NFA。jar为源码文件。 输出非确定有限自动状态机的有向图。如正则表达式: c(a|b)NFA为:0-c-&gt;1-ep-&gt;2-a-&gt;3-ep-&gt;7 ,0-c-&gt;1-ep-&gt;4-b-&gt;5-...

    正则表达式30分钟入门

    学习正则表达式快速入门的法宝。 语言深入浅出,举例实用、典型。 1、本文目标 2、如何使用本教程 ...19、平衡组/递归匹配 20、还有些什么东西没提到 21、联系作者 22、网上的资源及本文参考文献 23、更新纪录

    精通正则表达式~~~

    正则表达式的平衡法则... 186 若干简单的例子... 186 匹配连续行(续前)... 186 匹配IP地址... 187 处理文件名... 190 匹配对称的括号... 193 防备不期望的匹配... 194 匹配分隔符之内的文本... 196 了解...

    正则表达式 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 ...平衡组/递归匹配

    正则表达式30分钟入门教程

    1. 本文目标 2. 如何使用本教程 3. 正则表达式到底是什么东西?...19. 平衡组/递归匹配 20. 还有些什么东西没提到 21. 联系作者 22. 最后,来点广告…… 23. 网上的资源及本文参考文献 24. 更新纪录

    正则表达式实现excel判断(=IF(EXP,TRUE,FALSE))三元表达式(含各种嵌套复杂的判断表达式)分组提取内容

    IF(G2,(10-(G3-G2)*2)*G1,11*G1))就不行了,因为有很多的逗号和其他符号干扰,所以研究了一个正则表达式解决了这个问题,可以是任意复杂的IF表达式,如果需要进一步的匹配子判断式,则可以用自己擅长的语言做递归,...

    C#正则表达式的递归匹配分析

    在C#程序设计中经常会遇到这样的需求,要求匹配出成对的小括号里的内容,但是一般正则表达式中的 ?R 的语法似乎在C#中不被支持, 经过一番查找与测试,终于找到以下一段描述 /( 应该是 \( 不是用 /转义而是用 \来...

    正则表达式学习教程

    平衡组/递归匹配 还有些什么东西没提到 联系作者 网上的资源及本文参考文献 本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要...

    Regex Match Tracer 2.1 正则表达式软件

    正则表达式工具 Match Tracer ...支持高级正则语法,例如递归匹配等。 可以保存文本片段,例如表达式或者其他文本,也可以跟任意其他编辑器之前相互拖动。 可以保存当前表达式为一个‘快照’,使您可以放心改写表达式。

    MTracerFree_2.1 正则表达式验证工具

    则表达式工具 Match Tracer 是...支持高级正则语法,例如递归匹配等。 可以保存文本片段,例如表达式或者其他文本,也可以跟任意其他编辑器之前相互拖动。 可以保存当前表达式为一个‘快照’,使您可以放心改写表达式。

    DEELX 正则表达式引擎

    DEELX 是一个在 C++ 环境下的与 Perl 兼容的正则表达式引擎。是 RegExLab 开展的一个研究开发项目。 基本特点: 支持与 Perl 兼容的正则表达式语法。 支持 IGNORECASE, SINGLELINE, MULTILINE 等常见匹配模式。 ...

    Python基础入门知识之正则表达式学习 正则表达式30分钟入门教程 共21页.pdf

    目录 一、 本文目标 3 二、 如何使用本教程 3 三、 正则表达式到底是什么东西? 3 四、 入门 4 ...十九、 平衡组/递归匹配 18 二十、 还有些什么东西没提到 20 二十一、 网上的资源及本文参考文献 21

    正则表达式经典教程

    正则表达式经典教程,学习的好助手!1. 本文目标 ...19. 平衡组/递归匹配 20. 还有些什么东西没提到 21. 联系作者 22. 一些我认为你可能已经知道的术语的参考 23. 网上的资源及本文参考文献 24. 更新说明

Global site tag (gtag.js) - Google Analytics