深入浅出,手把手教你编写正则表达式

41次阅读

共计 1845 个字符,预计需要花费 5 分钟才能阅读完成。

日常代码的开发中,大家都或多或少的碰到一些正则表达式,但有的朋友只是会用,或者大致明白,希望这篇对正则深入浅出的文章能够让大家有所收获。
基本语法
[xyz] 一个字符集,匹配任意一个包含的字符
[^xyz] 一个否定字符集,匹配任何为包含的字符
\w (小写) 匹配字母或数字或者下划线的字符
\W (大写) 匹配不是字母,数字,下划线的字符
\s (小写) 匹配任意空白符
\S (大写) 匹配不是空白符的字符
\d (小写) 匹配数字
\D (大写) 匹配非数字的字符
\b (小写) 匹配单词的开始或结束的位置
\B (大写) 匹配不是单词开头或结束的位置
$ 匹配字符串的开始
^ 匹配字符串的结束
. 匹配所有,除了换行符
1. 重复 0 次或更多次
2. 重复 1 次或更多次
? 重复 0 次或一次
{n} 重复 n 次
{n,} 重复 n 次或更多次
{n, m} 重复 n 次到 m 次
等更多 ………
更多语法可以在 W3C 正则里查看
匹配位置
需要强调一下匹配位置的几个语法, 后面会一一举例说明 ^ 匹配字符串的开始 $ 匹配字符串的结尾(?=pattern) 正向前瞻,字符串匹配满足条件的位置(?!pattern) 负向前瞻,字符串匹配满足条件的位置
常用方法和属性
常用的方法

常用的方法为 test()和 exec()
常见的属性

ignoreCase 忽略大小写,默认为 false
global 全局匹配,默认为 false
multiline 在有换行的时候,可以得到换行的起始位置和终止位置,默认为 false
匹配规则
正则表达式 (regular expression) 描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等
当当看描述和说明文档可能有点太官方化了,先假设我们已经都了解了正则匹配的基本语法和大致的使用,接下来这里用简浅的例子一步一步来分析怎样去实现自己需要的正则表达式。
例子:手机号码
首先举个例子,要匹配一个手机号码。先分析一下手机号码有什么样的规则呢,1 开头,必须为数字,而且总共长度为十一位,那我们就有了下面这个表达式:
var reg = /^1[0-9]{10}$/ // 根据正则语法 ^ 为匹配开始,^1 就表示第一位必须为 1 开头,[0-9]指的是必须为 0 - 9 的数字,{10}表示重复次数为 10,$ 结束符。简单的匹配规则完成。
好像有点粗糙,一般手机号码第二位是不会有 0 - 9 这么多的可能的,所以我们需要在优化一下,第一位为 1,第二位为[3,5,8,7]:
var reg = /^1[3,5,8,7]{1}[0-9]{9}$/ // 根据正则语法 ^ 为匹配开始,^1 就表示第一位必须为 1 开头,[3,5,8,7]指的是匹配其中任一数字,{1}表示重复次数为 1,前两位匹配完成,加上后面的 [0-9],{9} 重复九次,$ 结束符。简单的匹配规则完成。
这样,基本的一个手机号码的正则匹配规则就出来了,如果自己业务有需求,做相对应的改动就可以了。
例子:邮箱
和手机号码的规则相比较,邮箱的匹配规则稍微复杂一点。同样,我们先分析邮箱的规则,比如 QQ 邮箱,110@qq.com,先有字符,长度大于 1,然后是 @,后面再跟着一串字符长度大于 1,那我们就可以得到这样一个的表达式:
var reg = /^[\w\.]+@[\w.]+$/ // [\w\.] \w 匹配字母或数字或者下划线的字符,\. 通过转义符表示匹配.,+ 表示重复一次或更多次,匹配 @符号,然后又是同样的 \w\. 匹配一次或更多次。
例子:网站
同样是分析网站规则,http(s)://segmentfault.com/1233, 首先可能是 http 协议或者 https 协议,然后是://,然后是字符串。这样一分析,再把对应的正则语法理一理,很快一个匹配规则就出来了:
var reg = /^https?:\/\/.+$/ // 首先会是 http 开头,^http, 然后 s 跟随? 表示匹配 0 次或一次,:,// 需要用 \ 转义,后面跟随各种类型的不确定因素.+,当然,如果我们要做的更精确的匹配,则可以修改成自己的规则即可。
举了几个基本的例子,让我们去复习巩固正则的基本使用和匹配规则,首先分析要匹配的规则是什么,然后一步一步去把规则拼积木一样拼进去,就可以了,自己多定义一些不一样的规则然后去一个一个实现,就会发现如果只是基本的使用,远没有想象中的难。
分组
之前有说到正则常用的方法,一个是 test(), 一个是 exec(),str.test(reg)是用来测试数据是否满足条件,从而得到一个布尔值,而 exec()一般则是用来
贪婪匹配和惰性匹配
正向前瞻和负向前瞻

正文完
 0