加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式学习笔记

发布时间:2020-12-13 23:05:35 所属栏目:百科 来源:网络整理
导读:微博项目做到了超链接解析部分,听说要用到正则表达式,于是苦逼地上网查、然后苦逼地看到了这些让人苦逼的东西。算,废话不说了。 如果是完全的初学者,有一个网站非常推荐: jb51.net/tools/zhengze.html 我就是看着这个学习的,现在在这里mark下我需要的

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

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

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、反义:

代码/语法 说明
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。比如bw+(?=ingb),匹配以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}匹配前面不是小写字母的七位数字



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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读