正则表达式学习笔记

来源:互联网 发布:快乐大本营自拍软件 编辑:程序博客网 时间:2024/06/02 06:06

微博项目做到了超链接解析部分,听说要用到正则表达式,于是苦逼地上网查、然后苦逼地看到了这些让人苦逼的东西敲打。算,废话不说了。

如果是完全的初学者,有一个网站非常推荐:

jb51.net/tools/zhengze.html

我就是看着这个学习的,现在在这里mark下我需要的东东。


我所理解的正则表达式的应用:正则表达式就是用来进行文本匹配的工具,例如:做网页前端的时候有时需要处理账号密码的合法性(打个比方,账号必须以字母开头,后面是n位数字;或者密码必须是长度为6到12的纯数字等)。在这些地方正则表达式都能起到至关重要的作用。但是正则表达式不提供任何数学功能,所以在做比如上述例子或者做例如匹配ip地址等时只能自己写一些略长的表达式来做到。


正则表达式的部分元字符:

匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束


例如:上述密码的判定可以用^\d{6,12}$,其中\为转义字符,同各编程语言;{n}表示匹配(满足条件的文本)重复n次,不多不少正好n次,而{m,n}(中间没有空格)是指匹配满足条件的文本不小于m次且不大于n次。


正则表达式中的限定符:

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n, m} 重复n到m次


例如:windows\d+代表匹配windows以及后面至少一个数字


自定义集合:“[]”

可以利用[]来定义要查找的字符集合。例如[13579](只查找1or3or5or7or9)、[abc](只找a or b or c)等。

一个更复杂的例子:\(?0\d{2}[- )]?\d{8}   直观上看,一个0加上两个数,后面又有八个数,可以猜测一下这是在匹配电话号码。实际上,让我们逐个字符分析:首先是\(?,一个转义字符加上一个(,表示(本身,后面又一个?,表示(出现一次或0次。然后一个0,然后两个数字,然后是自定义的集合,或者“-”或者“ ”或者")",三者之间的任意一个,然后一个问号表示出现一次或两次。最后是八位数字。大家把这些连起来试试:(010)12345678、010 12345678、01012345678、010-12345678等等都被匹配上了。当然了,大家可能也会注意到(010 12345678、010)12345678这样的也被匹配上了。这不是我们想要的,所以我们需要用到正则表达式的分枝语句。


正则表达式的分枝语句:

其实,所谓分枝语句就类似与编程语言中的||,无非就是变成了|,把它理解成或,就是指两者(或多者)之间满足任意一个条件即可匹配。直接上例子:

将上述电话号码更改一下:\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}   这个式子表示匹配的电话号码可以加空格也可以不加。需要注意的是,|跟||一样,是短路式的判定,也就是说,当条件一满足时条件二被忽略,所以应该把大条件放到后面(与try{}catch{}的抓异常方式一样)。


正则表达式的其他知识点:

由于我只是简单的用到正则表达式来处理超链接问题,所以剩下不少只是简单地在这里写一下好了。

1、正则表达式的分组:多个不同字符重复的匹配。用法:(#表达式#)

2、反义:

代码/语法说明\W匹配任意不是字母,数字,下划线,汉字的字符\S匹配任意不是空白符的字符\D匹配任意非数字的字符\B匹配不是单词开头或结束的位置[^x]匹配除了x以外的任意字符[^aeiou]匹配除了aeiou这几个字母以外的任意字符3、后项引用

分类代码/语法说明捕获(exp)匹配exp,并捕获文本到自动命名的组里(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号零宽断言(?=exp)匹配exp前面的位置(?<=exp)匹配exp后面的位置(?!exp)匹配后面跟的不是exp的位置(?<!exp)匹配前面不是exp的位置注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读


4、零宽断言与负向零宽断言

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配singdanc

(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading

零宽度负预测先行断言(?!exp)断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

同理,我们可以用(?<!exp),零宽度负回顾后发断言断言此位置的前面不能匹配表达式exp(?<![a-z])\d{7}匹配前面不是小写字母的七位数字



以上即为正则表达式的大部分内容,希望以后不会在遇到它尴尬


0 0
原创粉丝点击