正则表达式学习笔记(三)
来源:互联网 发布:简述数据库的隔离级别 编辑:程序博客网 时间:2024/04/29 19:34
前面回顾:
\b((?!abc)\w)+\b 匹配不包含连续的abc的字符串
(?<=<(\w+)>).*(?=<\/\1>) 这个表达式解析xml文件或者html文件最常用的了,获取一个<> </>标签内的内容
这个正则表达式没错,但是在“正则表达式测试器”中测试不行,这个估计是这个工具的一个bug。改一下,改为(?<=<(\w+)>).*(?=<\/\w+>),这样就行了,其实这个跟上面那个表达的意思是一样的,只不过上面那个使用了后向引用而已。
贪婪与懒惰:
当正则表达式中包含接受重复的限定符时,通常的行为是匹配尽可能多的字符。如a.*b,当匹配一个字符串如aabab时,它会匹配整个字符串。这称为贪婪匹配。
但有时候我们又希望尽可能匹配少的字符,也就是懒惰匹配。这时在接受重复的限定符后面加个问号。如上面的那个正则表达式加问号后为a.*?b,这样同样是重复无限次,但当匹配字符串时尽可能匹配少的。
a.*?b匹配aabab时会匹配aab和ab
前面学习过的表示重复次数的限定符,后面加一个?就成懒惰限定符:
*? 重复无限次,尽可能少
?? 重复0次或一次 ,尽可能少
+? 一次或者多次, 尽可能少
{n,m} 重复n到m次,尽可能少
{n,} 重复n次到无限次, 尽可能少
平衡组/递归匹配
当一个表达式中存在很多括号或者圆括号以及HTML或者XML这样的需要前后标签对应的字符串时,单纯的使用<\w+>这样的方式只会匹配最左边和最右边的尖括号,圆括号或者标签。
学过算法和数据结构,都知道,在求解这样的情况的时候,如果直接写算法来完成解析或者表达式的求解,一般都用堆栈的方式来完成。把一些前后需要匹配的内容压到堆栈里。这里也同样,使用堆栈的方式。
(?’group’) group及引号的后面一般都会跟有具体的内容,这里就是把这个具体的内容捕获到,并命名为group后压入堆栈。
(?’-group’) 捕获内容并从堆栈里弹出栈顶元素,如果堆栈为空,则匹配失败
(?(group)(?!)) 用于判断此时堆栈是否为空,一般放在表达式的最后位置,如果堆栈不为空,则匹配失败。
例如 HTML中经常使用的<div >经常会嵌套多层div容器
<div[^>]*>[^<>]*(((?’Open’<div[^>]*>)[^<>]*)+((?’-Open’</div>)[^<>]*)+)
*(?(Open)(?!))</div>
有了这个,我们解析HTML或者XML文件将方便很多。
正则表达式在处理字符串上有许多天然的优势,能以最少的代码完成最多的事情,基本上大多数编程语言都支持正则表达式,学习好正则表达式还是很有必要的。总结一下,自己学习过一遍,以后,用到了,再多来看看,回顾一下。
这里所列的正则表达式还没完全,但是基本上会用到的,都在三篇学习笔记中已有涵盖。
- 正则表达式学习笔记(三)
- 正则表达式学习笔记(三)
- delphi正则表达式学习笔记(三)
- 正则表达式笔记(三)
- 爬虫学习笔记(三)——Re正则表达式
- JavaScript 学习笔记 六 正则表达式《三》
- 【个人笔记】SIPp学习--正则表达式 <三>
- 正则表达式学习(三)
- 正则表达式学习(三)
- 学习正则表达式(三)
- 正则表达式学习(三)
- 正则表达式入门经典(学习笔记三)——正则表达式组成要素
- 正则表达式学习三
- js笔记(三)--正则表达式
- perl笔记(三)-正则表达式
- re2正则表达式引擎学习(三)
- python正则表达式学习(三)
- 正则表达式从零开始学习系列(三)
- NOJ上的大数相加
- 选购电脑填补知识
- winDbg定位异常崩溃和线程死锁三步骤
- 一次遍历, 查找不定长链表中点
- NOJ1004线性表操作
- 正则表达式学习笔记(三)
- HDOJ1114 Piggy-Bank[完全背包]
- 在BroadcastReceiver中启动Activity的问题
- HDUOJAlexandra and Prime Numbers
- django 安装小结
- 关系数据库 非关系数据库
- javaweb开发中常遇见的乱码问题
- android中Http
- 无法加载协定为“WeatherWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分