当前位置:  编程技术>其它

正则表达式话题

    来源: 互联网  发布时间:2014-10-13

    本文导语:  From: www.regexlab.com 引言     本文将逐步讨论一些正则表达式的使用话题。本文为本站基础篇之后的扩展,在阅读本文之前,建议先阅读正则表达式参考文档一文。 1. 表达式的递归匹配     有时候,我们需要用正则表达式来...

From: www.regexlab.com

引言

    本文将逐步讨论一些正则表达式的使用话题。本文为本站基础篇之后的扩展,在阅读本文之前,建议先阅读正则表达式参考文档一文。

1. 表达式的递归匹配

    有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况。比如,使用表达式 "( [^)]* )" 或者 "( .*? )" 可以匹配一对小括号。但是如果括号内还嵌有一层括号的话,如 "( ( ) )",则这种写法将不能够匹配正确,得到的结果是 "( ( )" 。类似情况的还有 HTML 中支持嵌套的标签如 " " 等。本节将要讨论的是,想办法把有嵌套的的成对括号或者成对标签匹配出来。

匹配未知层次的嵌套:

    有的正则表达式引擎,专门针对这种嵌套提供了支持。并且在栈空间允许的情况下,能够支持任意未知层次的嵌套:比如 Perl,PHP,GRETA 等。在 PHP 和 GRETA 中,表达式中使用 "(?R)" 来表示嵌套部分。

    匹配嵌套了未知层次的 "小括号对" 的表达式写法如下:"(  ([^()]  |  (?R))*  )"。

    [Perl 和 PHP 的示例代码]

匹配有限层次的嵌套:

    对于不支持嵌套的正则表达式引擎,只能通过一定的办法来匹配有限层次的嵌套。思路如下:

    第一步,写一个不能支持嵌套的表达式:"( [^()]* )","((?!).)*"。这两个表达式在匹配有嵌套的文本时,只匹配最内层。

    第二步,写一个可匹配嵌套一层的表达式:"( ([^()] | ( [^()]* ))* )"。这个表达式在匹配嵌套层数大于一时,只能匹配最里面的两层,同时,这个表达式也能匹配没有嵌套的文本或者嵌套的最里层。

    匹配嵌套一层的 "" 标签,表达式为:"((?!).|(((?!).)*))*"。这个表达式在匹配 "" 嵌套层数大于一的文本时,只匹配最里面的两层。

    第三步,找到匹配嵌套(n)层的表达式 与 嵌套(n-1)层的表达式之间的关系。比如,能够匹配嵌套(n)层的表达式为:

    [标记头]  ( [匹配 [标记头] 和 [标记尾] 之外的表达式] | [匹配 n-1 层的表达式] )*  [标记尾]

    回头来看前面编写的“可匹配嵌套一层”的表达式:

  ( ( [^()] | (([^()])*) )* ) ( (?!). | (((?!).)*) )*               PHP 和 GRETA 的简便之处在于,匹配嵌套(n-1)层的表达式用 (?R) 表示: ( ( [^()] | (?R) )* )

    第四步,依此类推,可以编写出匹配有限(n)层的表达式。这种方式写出来的表达式,虽然看上去很长,但是这种表达式经过编译后,匹配效率仍然是很高的。

2. 非贪婪匹配的效率

    可能有不少的人和我一样,有过这样的经历:当我们要匹配类似 "内容" 或者 "[b]加粗[/b]" 这样的文本时,我们根据正向预搜索功能写出这样的表达式:"([^(.*?)" 更好。


    
 
 

您可能感兴趣的文章:

  • Perl 正则表达式之角色化记忆
  • js正则表达式之RegExp对象之compile方法 编译正则表达式
  • Linux c++ boost库正则表达式用法
  • 正则表达式 表示 非指定字符串开头的正则
  • Python通过正则表达式获取,去除(过滤)或者替换HTML标签的几种方法
  • 正则表达式问题,使用正则表达式找出指定字符串并替换?
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • 正则表达式概述 什么是正则表达式 .
  • JS 正则表达式的相关方法(正则学习笔记1)
  • jQuery中的正则表达式分析 正则基础
  • java 正则表达式基础,实例学习资料收集大全 原创
  • 哪些命令可以使用正则表达式
  • 常用正则表达式及评注-学习正则必备
  • (菜鸟飞飞)问个正则表达式的问题
  • 向大家推荐一个收集整理正则表达式的网站
  • 正则表达式的问题
  • 关于正则表达式匹配问题
  • Python 匹配任意字符(包括换行符)的正则表达式写法
  • php 正则 不包含某字符串的正则表达式
  • Java正则表达式 reb4j
  • 大虾,请问谁有正则表达式的资料?谢谢!
  • java使用正则表达校验手机号码示例(手机号码正则)
  • 寻求正则表达试
  • 正则表达式中使用变量赋值
  • 用正则表达式来表示中文
  • java正则表达式验证函数
  • linux下有什么函数可以处理正则表达式?
  • emacs里空行的正则表达式如何写?
  • 关于sed的正则表达式
  • 正则表达式小疑问
  • killall 正则表达式用法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c#正则过滤图片标签 asp.net正则过滤的例子
  • 正则匹配后面非指定字符的正则 原创
  • PHP html标签正则替换并可自定义正则规则
  • python正则表达式去掉数字中的逗号(python正则匹配逗号)
  • 正则表达式口诀_学习正则的朋友值得一看
  • Javascript里的两种使用正则的方法
  • 常用正则 常用的C#正则表达式
  • asp.net正则表达式提取中文的代码示例
  • 正则式 ^[^ ](.*[^ ])?$ 的含义
  • 正则式如何只匹配一个汉字?
  • 正则表达式 口诀 学习正则的朋友看看
  • php使用正则过滤js脚本代码实例
  • shell ip 正则表达式
  • 让URL只允许一些字符的正则表达式
  • 关于通配符和正则表达式
  • 100分。关于字符串的正则表达式。
  • 正则表达式,相关链接
  • PHP正则匹配图片并给图片加链接详解
  • 正则表达式的一个小问题!!!
  • shell脚本中判断字符串匹配正则式的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3