正则表达式学习笔记
微博项目做到了超链接解析部分,听说要用到正则表达式,于是苦逼地上网查、然后苦逼地看到了这些让人苦逼的东西。算,废话不说了。 如果是完全的初学者,有一个网站非常推荐: aspzz.cn/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次
例如:windowsd+代表匹配windows以及后面至少一个数字
自定义集合:“[]” 可以利用[]来定义要查找的字符集合。例如[13579](只查找1or3or5or7or9)、[abc](只找a or b or c)等。 一个更复杂的例子:(?0d{2}[- )]?d{8} 直观上看,一个0加上两个数,后面又有八个数,可以猜测一下这是在匹配电话号码。实际上,让我们逐个字符分析:首先是(?,一个转义字符加上一个(,表示(本身,后面又一个?,表示(出现一次或0次。然后一个0,然后两个数字,然后是自定义的集合,或者“-”或者“ ”或者")",三者之间的任意一个,然后一个问号表示出现一次或两次。最后是八位数字。大家把这些连起来试试:(010)12345678、010 12345678、01012345678、010-12345678等等都被匹配上了。当然了,大家可能也会注意到(010 12345678、010)12345678这样的也被匹配上了。这不是我们想要的,所以我们需要用到正则表达式的分枝语句。
正则表达式的分枝语句: 其实,所谓分枝语句就类似与编程语言中的||,无非就是变成了|,把它理解成或,就是指两者(或多者)之间满足任意一个条件即可匹配。直接上例子: 将上述电话号码更改一下:(0d{2})[- ]?d{8}|0d{2}[- ]?d{8} 这个式子表示匹配的电话号码可以加空格也可以不加。需要注意的是,|跟||一样,是短路式的判定,也就是说,当条件一满足时条件二被忽略,所以应该把大条件放到后面(与try{}catch{}的抓异常方式一样)。
正则表达式的其他知识点: 由于我只是简单的用到正则表达式来处理超链接问题,所以剩下不少只是简单地在这里写一下好了。 1、正则表达式的分组:多个不同字符重复的匹配。用法:(#表达式#) 2、反义:
4、零宽断言与负向零宽断言
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。 (?<=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}匹配前面不是小写字母的七位数字。
以上即为正则表达式的大部分内容,希望以后不会在遇到它 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |