5分钟,正则表达式不再是你的烦恼!

Posted 小黑格子屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5分钟,正则表达式不再是你的烦恼!相关的知识,希望对你有一定的参考价值。

作为猿族的大家应该都知道,正则表达式在匹配查询内容和匹配搜索方面还是较为常用的。今天小黑就来分享一篇关于正则表达式的干货给大家,希望对大家有所帮助~


其实五分钟想详细看完都困难,跟不说了如指掌了。我所表达的意思其实是,五分钟浏览一篇,喜欢收藏备用,感觉一般,浏览一遍能记多少就看自己咯~


1、元字符

常用的元字符

5分钟,正则表达式不再是你的烦恼!

2、字符转义

如你要查找<code>.</code>,或者<code>*</code>,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用<code>\.</code>和<code> \* </code>。当然,要查找<code> \ </code>本身,你也得用<code>\\ </code>。


3、重复

常用的限定符

5分钟,正则表达式不再是你的烦恼!


4、字符类

[“your set”]:如[aeiou],则匹配<code>a</code>,<code>e</code>,<code>i</code>,<code>o</code>和<code>u</code>中的任意一个,同理[.?!]匹配标点符号(<code>.</code>或<code>?</code>或<code>!</code>)。


[0-9]:与<code>\d</code>就是完全一致,表示一位数字。


[a-zA-Z]:表示一个字母,[a-z0-9A-Z]等同于<code>\w</code>(当然值考虑英文的话)。


例4-1:\(?0\d{2}[)-]?\d{8}


分析


我们对它进行一些分析吧。

首先是一个转义字符<code>\(</code>,它能出现0次或1次<code>?</code>,然后是一个0,后面跟着2个数字<code>\d{2}</code>,然后是)或-或空格中的一个,它出现1次或不出现<code>?</code>,最后是8个数字<code>\d{8}</code>。



5、分枝条件

如果你认真去看例4-1,发现那个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。要解决这个问题,我们需要用到分枝条件。


正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用<code>|</code>(竖线)把不同的规则分隔开


例5-1:0\d{2}-\d{8}|0\d{3}-\d{7}


分析


注意

使用分枝条件时,要注意各个条件的顺序。因为匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。如:<code>\d{5}-\d{4}|\d{5}</code>和<code>\d{5}|\d{5}-\d{4}</code>是不同的。


6、分组

我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。


例6-1:(\d{1,3}.){3}\d{1,3}


分析




7、反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义。

常用的反义代码

5分钟,正则表达式不再是你的烦恼!


8、反向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。


后向引用用于重复搜索前面某个分组匹配的文本。例如,<code>\1</code>代表分组1匹配的文本。


例8-1:\b(\w+)\b\s+\1\b


分析

可以匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字<code>\b(\w+)\b</code>,这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符<code>\s+</code>,最后是分组1中捕获的内容(也就是前面匹配的那个单词)<code>\1</code>。


常用分组语法

5分钟,正则表达式不再是你的烦恼!


9、贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。


有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。


现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。


注意】最先开始的匹配拥有最高的优先权。

懒惰限定符

5分钟,正则表达式不再是你的烦恼!


附表

5分钟,正则表达式不再是你的烦恼!

5分钟,正则表达式不再是你的烦恼!

5分钟,正则表达式不再是你的烦恼!


<code>(pattern)</code> 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。


<code>(?:pattern)</code>    匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符“|”来组合一个模式的各个部分是很有用。


例如,“industr(?:y|ies)”就是一个比 “industry|industries” 更简略的表达式。


<code>(?=pattern)</code>   正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。


<code>(?!pattern)</code> 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。


<code>x|y</code>匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。


<code>用户名</code>:^[a-z0-9_-]{3,16}$


<code>密码</code>:^[a-z0-9_-]{6,18}$


<code>十六进制值</code>:^#?([a-f0-9]{6}|[a-f0-9]{3})$


<code>电子邮箱</code>:^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$


<code>URL</code>:^(https?://)?([\da-z.-]+).([a-z.]{2,6})([/\w .-]*)*/?$



<code>html 标签</code>:<([a-z]+)([<]+)*(?:>(.*)</\1>|\s+/>)$


<code>Unicode编码中的汉字范围</code>:^[u4e00-u9fa5],{0,}$


<code>匹配中文字符的正则表达式</code>: [\u4e00-\u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了


<code>匹配双字节字符</code>(包括汉字在内):[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)


<code>匹配空白行的正则表达式</code>:\n\s*\r

评注:可以用来删除空白行


<code>匹配HTML标记的正则表达式</code>:<(\S*?)[^>]*>.*?</\1>|<.*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力


<code>匹配首尾空白字符的正则表达式</code>:^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式


评注:表单验证时很实用


<code>匹配网址URL的正则表达式</code>:[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求


<code>匹配帐号是否合法</code>(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用


评注:匹配形式如 0511-4405222 或 021-87888822


<code>匹配腾讯QQ号</code>:[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始


<code>匹配中国大陆邮政编码</code>:[1-9]\d{5}(?!\d)

评注:中国大陆邮政编码为6位数字


<code>匹配身份证</code>:\d{15}|\d{18}

评注:中国大陆的身份证为15位或18位



<code>匹配特定数字</code>:


^[1-9]\d*$    //匹配正整数

^-[1-9]\d*$   //匹配负整数

^-?[1-9]\d*$   //匹配整数

^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)

^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)

^[1-9]\d*.\d*|0.\d*[1-9]\d*$   //匹配正浮点数

^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$  //匹配负浮点数

^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$  //匹配浮点数

^[1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)

^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)

评注:处理大量数据时有用,具体应用时注意修正


<code>匹配特定字符串</code>:


^[A-Za-z]+$  //匹配由26个英文字母组成的字符串

^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串

^[a-z]+$  //匹配由26个英文字母的小写组成的字符串

^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串

^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

往期精选



END

小黑是个好人,只推送有用的东西。

 长按左侧二维码关注

 微信ID:xhmsvip

 小黑QQ1:275326202(已满)

 小黑QQ2:3251175005

 小黑微博:小黑黑的格子屋

以上是关于5分钟,正则表达式不再是你的烦恼!的主要内容,如果未能解决你的问题,请参考以下文章

5分钟搞懂正则表达式!附“人话版”详解

5分钟包你学会正则表达式

5分钟包你学会正则表达式

分分钟通过ip锁定你的位置:正则表达式,re模块,requests模块,json模块组合应用--日志分析

正则表达式

python,用正则表达式匹配特定汉字