![](https://img.haomeiwen.com/i4563271/882253a422cca8f4.png)
- 正则表达式:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。在开发的使用场景 - 例如:匹配url等等
本文中,对正则表达式的一些语法使用,进行了探究与测试,其中包括以下几部分:
①.正则表达式模块组成
②.正则表达式的语法 - '.' , '[...]' , '\d \D' , '\s \S', ' \w \W'
③.正则表达式的语法 - ' * ', ' + ', ' ? ', ' {m} {m,n}', ' *? +? ?? '
④.正则表达式的语法 - '^', ' $' ,' \A \Z'
⑤.正则表达式的语法 - '|' , ' (ab) ',
- 特别说明,图片名称 与上图的目录对应: 四[n] = 语法四 = 第⑤条!
![](https://img.haomeiwen.com/i4563271/d59bb6d0f389e8fb.png)
a.使用re的compilie - 生成 pattern对象
b.调用pattern的方法 - 匹配字符串 -- 方法举例:match
--match:从字符串开头开始匹配,匹配的内容是 compile(‘str’)中的 str
c.返回一个匹配结果 - result
![](https://img.haomeiwen.com/i4563271/d502c41937075ed1.png)
![](https://img.haomeiwen.com/i4563271/d455be01a216077e.png)
- 使用find方法
- 找到,就返回起始索引起始下标
- 找不到,就返回 -1
![](https://img.haomeiwen.com/i4563271/9a1929fd4a7b4d50.png)
- 使用 startswitch - 判断起始字符串 匹配
使用正则匹配
![](https://img.haomeiwen.com/i4563271/130e0d08f4f0ff62.png)
a.查看pattern内容
![](https://img.haomeiwen.com/i4563271/5eed75d8ddf43699.png)
b.查看pattern类型 - pattern实例
![](https://img.haomeiwen.com/i4563271/9cb7bee1454eb56e.png)
c.查看pattern的所有方法
![](https://img.haomeiwen.com/i4563271/d3db892becdf7a7f.png)
d. 查看match的用法:
![](https://img.haomeiwen.com/i4563271/13a70b5b69b5f01a.png)
- match用法 - 从起始位置开始匹配
匹配成功的话 - 返回对象
匹配不到的话 - 返回zero
![](https://img.haomeiwen.com/i4563271/b916d7abfb13a749.png)
- 使用match - 开始匹配
![](https://img.haomeiwen.com/i4563271/a4051d9a64037a7d.png)
![](https://img.haomeiwen.com/i4563271/3fbb9fdddbb9a6c6.png)
==> 匹配成功,返回对象
![](https://img.haomeiwen.com/i4563271/b710c61034a4628b.png)
==>匹配失败 - 返回zero
匹配数据查看
-
查看匹配的内容 - group()
15.png
![](https://img.haomeiwen.com/i4563271/27e5b6d12f1e6c58.png)
group() - 使用说明 - 返回字符串or 元组
==>匹配的内容是'()' - 返回元组
==>匹配的内容是str - 返回字符串
-
查看 匹配内容在源字符串中的 - 位置
17.png
a.查看匹配规则 - miliLV
![](https://img.haomeiwen.com/i4563271/d17821283be3a95b.png)
b.查看源字符串
![](https://img.haomeiwen.com/i4563271/170cfdc47860141d.png)
![](https://img.haomeiwen.com/i4563271/670f35d1602bbf77.png)
c. miliLV 在 'miliLV study python' 字符串中的 [0,6)位置,没毛病
- 查看源字符串 - string
![](https://img.haomeiwen.com/i4563271/3ec7014fee020ea1.png)
- 匹配大小写 - 大写的ignorecase
![](https://img.haomeiwen.com/i4563271/d28c1ba423c713d2.png)
匹配规则 - ‘python’ + re.I => 可以匹配大写的'python'
![](https://img.haomeiwen.com/i4563271/48f793071cf4f679.png)
进行匹配的数据源 - 'PYThon'
![](https://img.haomeiwen.com/i4563271/3c3fbac8c9218caa.png)
查看匹配结果
![](https://img.haomeiwen.com/i4563271/b5e7c7c5346921f2.png)
匹配的规则 - 'python' ,re.I
匹配数据源大写的PYT 拼小写的 hon! == 'PYThon'这个匹配规则,只要是 'python'这个str,无论里面的字符大小写,都可以顺利匹配!
-
直接使用match的方式 - 不多设置一个pattern接收
26.png
![](https://img.haomeiwen.com/i4563271/69b5be1fcfaf5df7.png)
正则表达式语法说明一: '.' , '[...]' , '\d \D' , '\s \S', ' \w \W' 用法
![](https://img.haomeiwen.com/i4563271/db2c9ca0a18022e8.png)
- 使用“.” 匹配 --> 除了\n以外的所有字符
①.'a' 匹配 'a'
![](https://img.haomeiwen.com/i4563271/dda1c8639a370593.png)
②.'a'的规则 - 匹配内容:‘b’
![](https://img.haomeiwen.com/i4563271/f57c692cd88b2693.png)
③.使用万能匹配 - '.'
![](https://img.haomeiwen.com/i4563271/30bbb3046f84e331.png)
④.查看'.'的匹配规则:
![](https://img.haomeiwen.com/i4563271/2cc85aa30b2b138c.png)
- 匹配 - 字典{xxx}
-
{ } 中 - 内容是字符
一(6).png
-
{ } 中 - 内容是数字
一(7).png
-
{ }中 - 内容有多个字符
一(8).png
总结: 一个“.” 只能对应一个字符!
疑问 - 多字符匹配如何匹配??
![](https://img.haomeiwen.com/i4563271/f47734a56edc6c5b.png)
![](https://img.haomeiwen.com/i4563271/49015027bc9ef7e0.png)
![](https://img.haomeiwen.com/i4563271/fd63cb8ad9ed4b80.png)
总结:
几个字符 - 就用几个"." 去对应匹配一个点不是匹配一个字符串!而是一个字符!
所以上图的{.} - 匹配不了两个字符{ 1C }的内容!- zero!
- 字符集匹配 - [ ... ]
![](https://img.haomeiwen.com/i4563271/7828588b31da40a4.png)
- 匹配 - ['abc'] 字符集‘abc’中的某个字符是否存在
![](https://img.haomeiwen.com/i4563271/02bb7be283c96633.png)
- 匹配非字符集中的字符 - 比如'd'
![](https://img.haomeiwen.com/i4563271/b45c4388f7645513.png)
- 为了让d 包含在字符集中匹配 - 修改匹配规则
![](https://img.haomeiwen.com/i4563271/31516b98849e297c.png)
虽然可以一个一个写,但是如果匹配的规则是所有英文字母,不得写a,b,c,d, ... z?
解决办法 : 区间匹配 - 使用简写
![](https://img.haomeiwen.com/i4563271/d46c63a5a8ef07a6.png)
大写字母 - 大A呢?
![](https://img.haomeiwen.com/i4563271/604670886d1d1972.png)
- 解决办法:必须要再添加A-Z的匹配规则,a-z 是无法匹配大写字母 “A”的
![](https://img.haomeiwen.com/i4563271/af27b724252c41a5.png)
![](https://img.haomeiwen.com/i4563271/3a40f493a0897c89.png)
区间匹配,匹配规则如下
- 可以连着写 : a-zA-Z
- 也可以用“,”隔开 : a-z,A-Z
==> 怀疑:[a,b]规则 - 匹配 ‘1,2’
![](https://img.haomeiwen.com/i4563271/8add0f748788fb6e.png)
![](https://img.haomeiwen.com/i4563271/7b0fe9f0cf28a83f.png)
- 不管a & z 的顺序,写在第一个的,就会被匹配
测试 -匹配双字符呢?
![](https://img.haomeiwen.com/i4563271/78a90a6b171cfc47.png)
![](https://img.haomeiwen.com/i4563271/bd465c6f43cbbd85.png)
总结: 一个‘[ ]’ 就是匹配一个字符,多余的字符会被忽略!
-
匹配单词字符 \w
一(24).png
- 正常匹配字符 --> \w
![](https://img.haomeiwen.com/i4563271/49a68d5ea42ff768.png)
![](https://img.haomeiwen.com/i4563271/b3ce9960b0d9dd99.png)
2.使用单词匹配 :\w -匹配非正常字符 - 例如此处的“ ” - 空格
![](https://img.haomeiwen.com/i4563271/15e031a7d2258f39.png)
3.使用非单词匹配 : \W - 匹配非正常字符 - 空格
![](https://img.haomeiwen.com/i4563271/e42954eaed918e1c.png)
- 匹配内容为 - [xxx]的情况下
1.匹配规则'[xxx] '
![](https://img.haomeiwen.com/i4563271/f98e01bf178244a7.png)
2.匹配规则 - '[[xxx]]'
![](https://img.haomeiwen.com/i4563271/8ac346fed5c749b6.png)
3.解决办法 - 加转译字符!
![](https://img.haomeiwen.com/i4563271/6277553d92870e62.png)
正则语法二 * __ + __ ? __ {m}/{m,n} __ *?/+?/??
![](https://img.haomeiwen.com/i4563271/b7ea55b6f78cba4f.png)
- 正则匹配 - *
-
匹配 - 双字符的情况下
二(2).png
-
匹配 - 单字符的情况下
二(3).png
- * 排上用场的时候!
![](https://img.haomeiwen.com/i4563271/f41bfb604e728bd1.png)
![](https://img.haomeiwen.com/i4563271/8f7d3c0b81e72aaa.png)
* 可以匹配 0 次 或者多次,例如上图的[a-z]* 匹配0次,也成功匹配!
- test:*匹配无限次!
1.常规匹配 - 未使用 *
![](https://img.haomeiwen.com/i4563271/49754f2c5d8c2eae.png)
2.优化匹配 - 带 *
![](https://img.haomeiwen.com/i4563271/c2566f1b7a9e63d0.png)
- test:数字开头的匹配
-
数字开头
二(8).png
-
数字结尾
二(9).png
总结:
- * 代表可以出现0次 or 无限次
- *的结尾标志 - 出现在 不满足匹配规则的第一个字符开始,全部舍弃
- 正则匹配 - “+” 号
![](https://img.haomeiwen.com/i4563271/e30d10b3359e0560.png)
- 例如:项目需求 - 测试变量名是否正确
①.大小写字母开头
![](https://img.haomeiwen.com/i4563271/230f9dc59397b1f3.png)
②.下划线开头
![](https://img.haomeiwen.com/i4563271/c83e11f2a7371c56.png)
![](https://img.haomeiwen.com/i4563271/44a75bb10747af91.png)
![](https://img.haomeiwen.com/i4563271/46fad31a2bba5973.png)
③.数字开头
![](https://img.haomeiwen.com/i4563271/8d783191f89f8a07.png)
变量名 -- 只能以 下划线_ or 大小写字母开头!
- 正则 - 开头 ==> 大小写字母 or _ 至少一次,可以多次 ==> '+' 派上场了!
①.匹配单字符
![](https://img.haomeiwen.com/i4563271/de84b52ed472d6bc.png)
②.匹配单下划线
![](https://img.haomeiwen.com/i4563271/f2e01b1d118f5b0d.png)
③.匹配 - 多字符
![](https://img.haomeiwen.com/i4563271/539b8dacc2e0bf46.png)
==> 只匹配了一个字符!! 所以需要'+'登场了!
④.匹配 - 多字符 && 使用 '+'
![](https://img.haomeiwen.com/i4563271/79b6fa435e4eaa75.png)
⑤. 匹配 - 带数字的!比如button1
![](https://img.haomeiwen.com/i4563271/93d75bcb99f8c595.png)
⑥.优化- 加号+ && * 结合使用!
![](https://img.haomeiwen.com/i4563271/aea0f19929be332e.png)
思路:
- 英文字母 or _ 开头是必须的,所以用 加号 - 表明只是匹配一次
- 除了首字符,其他的可以用数字,英文字母等,但是不一定要有!所以可以0次,用*
test:
①.前部分用+,匹配后部分(数字or英文字母,但是不设置 * 的次数)
![](https://img.haomeiwen.com/i4563271/97ca599d664c87da.png)
前部分[_,a-z,A-Z] 使用了‘+’,表示可以1-N次,当第一个不满足匹配规则的 - 数字1出现之后,停止前部分匹配 - 使用后部分 带[0-9]的匹配规则
②.后部分的匹配内容 - 数字长度改为不等于1之后:
![](https://img.haomeiwen.com/i4563271/380a8650eb45e16b.png)
③.优化:使用'*' - 表示后部分的规则 - 可以不出现 or 出现多次
![](https://img.haomeiwen.com/i4563271/20bca89519a2d017.png)
-
正则匹配 - “?” 号
二(25).png
例如 - 验证:一个数字 - 是否是0-99直接的数字
分析 ->
- 最少一位,至多2位,个位数上的是必须的,所以直接用[0-9]
- 十位数上,可能有,也可能没有,如果0-9,就没有十位数,所以十位数上匹配规则 --> '[1-9]?'
- 加个问号 - 代表十位数可以有一次,也可以没有!
test:
-
常规数字:
二(26).png
-
个位数为 0
二(27).png
-
小于10的个位数数字
二(28).png
-
特例:创世神- 09(以0开头的 - 个位数!)- dotaer才懂的这个梗
二(29).png
解释原因:
- 查看十位数的匹配规则 - [1-9]? -- 此时十位数是0,所以不满足[1-9]的匹配条件,并且十位数是 ? - 可以为 0次! --> 所以首数字 -0 直接进入后半部分匹配!
- 个位数匹配规则 - [0-9],并且只能匹一次,此时进来匹配的是 '09' ==> ‘0’满足 匹配条件 -[0-9]! ==> 所以最终输出0,因为个位数的匹配是 - [0-9],并没有+ or * ,所以只匹配一个字符 --> ‘0’,剩下的'9'就被舍弃了
- 正则语法之 - 匹配字符出现次数 - {a}/{a,b}
![](https://img.haomeiwen.com/i4563271/a3fff44fa7693ae5.png)
①.匹配5次 - { 5 }
![](https://img.haomeiwen.com/i4563271/7124c1e971ca39c0.png)
②.不满足条件的 { 5 }
![](https://img.haomeiwen.com/i4563271/b82ed8ff42d1c3b3.png)
解释:虽然参与匹配的str 是 ‘1234A’有五个字符,But并不是所有字符都满足匹配规则! 最终只有1234满足,所有匹配的次数 - 4次 != 5次,不满足! -> 返回zero!
③.设置区间匹配 {4,6}
![](https://img.haomeiwen.com/i4563271/741500fb40fd6f31.png)
④. 测试 - 越界
![](https://img.haomeiwen.com/i4563271/8bfffc04f5863af1.png)
⑤.测试 - 部分不满足匹配规则的 - str
![](https://img.haomeiwen.com/i4563271/4e39ad7c87e7e4f5.png)
⑥.测试 - gamil邮箱 - 假定6位字符 + @ gmail.com
![](https://img.haomeiwen.com/i4563271/93b51e4bafa5ac26.png)
⑦.测试 - 越界
![](https://img.haomeiwen.com/i4563271/5c000f634a1d5193.png)
⑧.优化 - 改善匹配规则的次数
![](https://img.haomeiwen.com/i4563271/2627928c3c7aa653.png)
- 贪婪模式与非贪婪模式 - ?
![](https://img.haomeiwen.com/i4563271/307945fbcd90afde.png)
- 贪婪匹配 - *
![](https://img.haomeiwen.com/i4563271/7efd1c8483b8afd9.png)
贪婪模式- abc均在 [a-z]* 的匹配规则下,所以全匹配了 - 尽可能多的匹配
-
非贪婪模式 - *?
二(41).png
- * 的匹配次数是 - [0,n],贪婪模式取最多 -n,非贪婪模式 取最少 ==>0
- 所以后部分[a-z]直接匹配0次,最终只匹配前部分 - [0,9]
- 而且[0-9] 没加 * or + 修饰,所以只匹配一次
-
同理,贪婪模式下的 ==> '+' 匹配
二(42).png
-
非贪婪的 '+' 匹配 ==> 取最低 - 一次匹配!
二(43).png
-
贪婪模式下的 '?' ==>( ? 表示:匹配 0 or 1 次!)
二(44).png
6.非贪婪模式下 '?' ==> ([0,1] - 取最少 = 0次!)
![](https://img.haomeiwen.com/i4563271/5cb98b9c1f5e5933.png)
正则语法三 ^ __ $ __ \A __ \Z __
![](https://img.haomeiwen.com/i4563271/a5d190a6ee97f864.png)
总结: 字符串开头 - ^
字符串结尾 - $
①.邮箱匹配
![](https://img.haomeiwen.com/i4563271/8a29e363cc2082ee.png)
②.如果-结尾在.com之后,又加了一堆东西
![](https://img.haomeiwen.com/i4563271/9774f2e67d598704.png)
所以:为了正确匹配邮箱,应该设置以.com结尾为匹配条件! -> 使用$结尾符
![](https://img.haomeiwen.com/i4563271/87e838390726ff46.png)
③.正确匹配结果如下:
![](https://img.haomeiwen.com/i4563271/c564264683b7e570.png)
④.完整写法 - 再加上开头^
![](https://img.haomeiwen.com/i4563271/f4cdeb3eb195e4d7.png)
![](https://img.haomeiwen.com/i4563271/e758e2297091f905.png)
test:
1.\A 写在匹配规则前
![](https://img.haomeiwen.com/i4563271/1c72e058068e34c3.png)
-
跟*/ + ? 一样,写在后面?
三(9).png
3.正确写法:
![](https://img.haomeiwen.com/i4563271/eea60535d490e4eb.png)
\A写在前面没错,第一次error,内容里有','
匹配规则 - \w - 只能匹配字符!数字 && 大小写字母 && 下划线_ !
![](https://img.haomeiwen.com/i4563271/a736a0f17c3d8905.png)
![](https://img.haomeiwen.com/i4563271/e5d1dd31dc0f73cc.png)
正则语法四 | && (ab)
![](https://img.haomeiwen.com/i4563271/30c7e15ae35a29fa.png)
-| '或' 的用法
①.'abc' | '123' ==> 可以匹配 'abc' or '123'!
![](https://img.haomeiwen.com/i4563271/7de64e3bf4cb81fe.png)
![](https://img.haomeiwen.com/i4563271/d21425667d340be0.png)
- 'abc|123' 去 匹配 'abc|123'
![](https://img.haomeiwen.com/i4563271/f9dbf02fc06b6a8d.png)
猜测结果:
- 匹配成功:匹配的内容group = 'abc|123'
- 匹配失败:只能匹配‘abc’ or ‘123’
②.结果如下:
![](https://img.haomeiwen.com/i4563271/0494b266fca397f7.png)
原理解释:
- 拿'abc|123' 去 匹配规则 -- 'abc|123' 中匹配,发现 匹配规则 - | 前部分的 abc 正好与 我们的源字符串'abc|123'的'abc'匹配 - 满足匹配规则 - success ==> group = 'abc'!
test2:
![](https://img.haomeiwen.com/i4563271/858cd810f9a0dc3b.png)
猜测 - 匹配不上:
- 匹配规则 - 'abc|123'
- 数据源 ---- '123|abc'
- 均不对应,匹配不上!
③.结果如下:
![](https://img.haomeiwen.com/i4563271/070b5c3f49139fa9.png)
原理解释:
- 数据源 -- '123|abc' 去 匹配规则'abc|123'中查找
- 前部分 'abc'不符合 - 跳过
- 后半部分 '123'符合匹配条件 -- 匹配成功! group = 123
- 分组 - 使用'()'实现
![](https://img.haomeiwen.com/i4563271/e8101a46f858e520.png)
①.需求 : 匹配gmail邮箱:
![](https://img.haomeiwen.com/i4563271/b1db151b3396608f.png)
②.需求 - 匹配 gmail && 163 邮箱 - 思路 : 使用 “|”(或)
![](https://img.haomeiwen.com/i4563271/69bb439b0128e8e8.png)
③.精简写法 - 不抄写整个的邮箱
![](https://img.haomeiwen.com/i4563271/d3e2b949d4a253f9.png)
- 想要实现参数 ~ gmail || 163的替换,但是后半部分 - 直接被舍去匹配了
特别注意:这里的匹配,并不是 - ‘gmail' or '163.com'! -- 这整个后半部分
![](https://img.haomeiwen.com/i4563271/83efa378aff0330a.png)
- 解决办法 - 正确使用分组 - ()
![](https://img.haomeiwen.com/i4563271/2247114a3107e7d3.png)
![](https://img.haomeiwen.com/i4563271/dd6f3d25dc03dc04.png)
![](https://img.haomeiwen.com/i4563271/5fbcb2ab2d524f8b.png)
主要用在XML标签中,暂不学习
学习就要不断的保持对未知知识的兴趣,不是别人说什么就是什么。要勇于提出质疑,sunnyxx大神说的 - 要勇于提出质疑,‘凭什么你说的就是对的?我也要试试’
正则的规则其实是可以背的,但是如果不自己去探究一波,感觉很多东西就只是死记硬背,终究还是会忘记,只有自己掌握的,才是自己的~
网友评论