正则表达式学习笔记(三)

来源:互联网 发布:简述数据库的隔离级别 编辑:程序博客网 时间: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文件将方便很多。

 

正则表达式在处理字符串上有许多天然的优势,能以最少的代码完成最多的事情,基本上大多数编程语言都支持正则表达式,学习好正则表达式还是很有必要的。总结一下,自己学习过一遍,以后,用到了,再多来看看,回顾一下。

 

这里所列的正则表达式还没完全,但是基本上会用到的,都在三篇学习笔记中已有涵盖。

0 0
原创粉丝点击