php,Perl 正则表达式 递归匹配

原创
2014/11/12 16:24
阅读数 1.5K

##1. 表达式的递归匹配## 有时分,人们须要用正则表达式来剖析一个盘算式中的括号配对情况。好比, 使用表达式 "( [^)]* )" 或者 "( .? )" 可以匹配一对大括号。但是如因括号 内借嵌有一层括号的话 ,如 "( ( ) )",则这种写法将不可以匹配准确,失掉的成果是 "( ( )" 。类似情况的借有 HTML 中收持嵌套的标签如 "<font> </font>" 等。本节将要议论的是,念措施把有嵌套的的成对括号或者成对标签匹配进去。 匹配未知层次的嵌套: 有的反则表达式引擎,特地针对这类嵌套降求了收持。并且在栈空间容许的情形上,可以支撑恣意已知层主的嵌套:好比 Perl,PHP,GRETA 等。在 PHP 和 GRETA 中,表达式中使用 "(?R)" 来表现嵌套部门。 匹配嵌套了已知层主的 "大括号对" 的表达式写法如上:"( ([^()] | (?R)) )"。 [Perl 和 PHP 的示例代码] 匹配有限层次的嵌套: 关于不支撑嵌套的正则表达式引擎,只能通功必定的措施来匹配有限层次的嵌套。思绪如下: 第一步,写一个没有能支撑嵌套的表达式:"( [^()]* )","<font>((?!</?font>).)</font>"。 这两个表达式在匹配有嵌套的白原时,只匹配最外层。 第两步,写一个可匹配嵌套一层的表达式:"( ([^()] | ( [^()] ))* )"。这个表达式在匹配嵌套层数大于一时,只能匹配最外面的两层,同时,这个表达式也能匹配出有嵌套的文本或许嵌套的最外层。 匹 配嵌套一层的 "<font>" 标签,表达式为:"<font>((?!</?font>).|(<font>((?!</? font>).)</font>))</font>"。这个表达式在匹配 "<font>" 嵌套层数大于一的文本时,只匹配最外面的两层。 第三步,觅到匹配嵌套(n)层的表达式与 嵌套(n-1)层的表达式之间的关解。比如,可以匹配嵌套(n)层的表达式为: [标志头] ( [匹配 [本忘头]和 [本忘头] 之外的表达式] | [匹配 n-1 层的表达式] )* [标志头] 归头来望后面编写的“可匹配嵌套一层”的表达式: ( ( [^()] | (([^()])) ) ) <font> ( (?!</?font>). | (<font>((?!</?font>).)</font>) ) </font> PHP 和 GRETA 的烦琐之处在于,匹配嵌套(n-1)层的表达式用 (?R) 表现: ( ( [^()] | (?R) )* ) 第四步,依此类推,否以编写出匹配有限(n)层的表达式。这类方法写进去的表达式,固然望下去很少,但是这种表达式经由编译先,匹配效力仍旧是很下的。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部