花了一点时间看了一下想看很久的正则
首先来介绍一个神器,window下面有一款正则神器RegexBuddy
密码:fbs0
常用功能大概有:
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),又称正规表示式、正規表示法、正規運算式、規則運算式、常規表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器裡,正則表达式通常被用来检索、替换那些符合某个模式的文本。 --wiki
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 --某度
学习正则其实很简单,无非就是学习元字符和他们的相互关系
元字符包括五种字符:普通字符,标准字符,特殊字符,限定字符(又叫量词),定位字符(也叫边界字符)
因为特殊字符的用途很广泛,分组间也很独立,所以我会在介绍其它字符的同时一点点地讲讲特殊字符,到最后汇总一下便好了.
包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号(包括汉字)
除了直接写之外,还可以用范围输入,比如
[a-z] [A-Z] [0-9]
比方说我们有这样一个正则(默认Regex后面的为正则)
regex=Hello World
贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。
非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配,也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,至于还有没有没捡的就不管了。
正则默认是__贪婪模式__ ,那怎么才能进入非贪婪模式呢?
但要是我想皮一下,一个字符我就想让他"贪婪"个3次,或者是就匹配几次以上,又或者是几次到几次,又要怎么实现了?
这个时候就要介绍一下限定字符了,这又称特殊字符,又称限定符,又称量词,·······
万变不离其宗,先来看看他有哪些东西:
字符 | 含义 |
---|---|
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式零次或一次 |
{n} | 匹配确定的 n 次 |
{n,} | 至少匹配 n 次 |
{n,m} | 最少匹配 n 次且最多匹配 m 次 |
以上n,m为非负整数,且n <= m.
这里的*和+都是贪婪模式,只有?是非贪婪模式,整体是否开启贪婪模式可以由编程决定.
?的定义要记一下,记一下,记一下.埋个蛋
至于为什么可以叫成量词呢?
标准字符其实就是将普通字符分类,所以大多能被等效
虽然很多,但是目前我们只要记住\d和\w就完事了.
可以看到正则表达式的第一个取反的操作:改成大写
可以看到标准字符里面有很多都是__一个__了吗?这就是量词(限定字符)发挥作用的时候了.
比如说匹配4位数字,我们可以这样写:
方法一:Regex = /d/d/d/d
方法二:Regex = /d{4}
方法三:Regex = /d/d{3}
注意方法三,并不是2乘3匹配6个,因为__量词只对前一个字符起作用__
需求:检验6位中奖用户提交的6注6合彩是否正确 (以随机数个空格隔开)
分析:
你可能会说:妈耶,你超纲了,’ ^ '是什么鬼?
这个需求很简单
怎么实现我不管
明天上线
还有,检验完之后不提取的吗?
###定位字符
注意!
定位字符是__零宽的__
毕竟他是用来标记,这里是开头,这里是结尾,这里是边界等这些信息的,标记匹配的不是字符而是符合某种条件的位置,所以定位字符是“零宽的”。
字符 | 含义 |
---|---|
^ | 匹配开头 |
$ | 匹配结尾 |
\b | 匹配一个单词边界 |
\b的单词边界指的是:前面的字符和后面的字符不全是\w
比方说:
Regex = IPHONE\b
分析一下:因为 \b的左边是E,是一个\w字符,\b的单词边界指的是:前面的字符和后面的字符不全是\w,也就是说,只有在\b右边的字符不是\w的时候能被匹配,IPHONE1前面是E,后面是1,都是\w字符,所以不是单词边界.
这里开始介绍括号了,稍稍有点难度罢了.复制一下别人家的东西:
regex=x|y,匹配字符x或y。( )表示捕获组,( )的作用如下:
括号中的表达式可以作为整体被修饰,用来表示匹配括号中表达式的次数,regex=(abc){2,3},可以匹配连续的2个或3个abc
括号中的表达式匹配到的内容会存储起来,并获取到括号中表达式匹配到的内容
划重点了,正则表达式所获取到的东西是括号中表达式匹配到的内容,由于正则存在着贪婪模式,所以返回的是一个array/list/group/map······
每一个括号按照左括号的顺序自动编号,也是程序返回的编号.不仅决定了程序返回的编号,同时也可以通过**反向引用(后向引用)**来将获取到的组在匹配一次.但是这对入门就不太友好了,可以参考参考资料.
(?:pattern)表示非捕获组,匹配括号中表达式匹配到的内容,但是不进行存储匹配到的内容。这在使用 “或” 字符?(|)?来组合一个正则的各个部分是很有用的。
例如:匹配字符“story”或者“stories”,regex=stor(?:y|ies)就是一个比 regex=story|stories更简略的表达式。
又叫预搜索,又叫零宽断言,又叫环视,也是零宽的.相当于c语言里面的if()里面的(),也就是逻辑判别.
放个简单版的图:
字多一点的:
需求:通过一段英文探测男/女朋友爱不爱我 ,爱的话要求返回"want "
分析:
方括号[ ]表示字符集合,即[ ]表示自定义集合,用[ ]可以匹配方括号里的任意一个字符。没有顺序没有顺序没有顺序
所以你可以这样写:
[1-9a-zA-z]
[A-z1-9a-z]
[a-zA-z1-9]都是同一个意思,识别__任意一个__字母或者数字
在自定义字符里面,只有小尖角"^",中折号"-"和标准字符外,其它特殊符号皆失去特殊意义!
可见参考资料
之前也介绍得7788了,这里就放张常用的图.特殊字符唯一一个和其它字符不一样的一点就是:他很特殊…
电话号码由数字和“-”组成
IP地址的格式:(1255).(0255).(0255).(0255)
###日期格式的正则
日期格式:yyyy-mm-dd
这些题目摘自第二篇参考资料,可惜的是他的正则大部分是考虑不全面的…会另开一个正则例子来解答这些练习题和再补充一些常用正则
##正则表达式的运算优先级
昨天写的时候忘记写这个了,这里先放张图,后面再来填坑
优先级从高到低.
如果你想请我吃个南五的话
参考资料:
参考资料有些的例子是错的,又或者是考虑不完全的,大家斟酌看看
正则表达式 - 语法
正则表达式从入门到实战_可能打不开…
【正则表达式系列】贪婪与非贪婪模式
正则基础之——贪婪与非贪婪模式
正则表达式小括号的多义性
正则表达式中括号的多义性
正则表达式及其常用特殊符号和字符
分组与后向引用
正则基础之——反向引用
正则表达式中的反向引用
最常用的详细正则表达式大全
不会的话就