学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。我觉得正则表达式很像大一时候学习的离散数学的,使用“与或非(&,|,^)”的逻辑表达式来抽象一段复杂的自然语言描述,从而解决一些逻辑分析问题。
1.语法:
2.实例
当我们进入大学的时候,每个同学都会有一个学号(例如我的学号是201235010126)。在我们的大学,学号里面集中了年级,专业代码,班级代码,学生编号的种种信息,由此得到每一个同学唯一的ID号。今天这里采用专业年级的例子,由浅入深,讲解一个复杂表达式的来源。下面结合自己情况,以所在大学湖南大学保密专业为例,写一写学习正则表达式心得。
学号编码规则:
对201235010126来说:
条件1:1-4位(2012)表示年号
条件2:5-8位(3501)固定是专业号3501
条件3:倒数第三位表示班级号,每个年纪有6个班级
条件4:最后两位表示班级内学号,每个班有32人
条件5:12级开始倒数第四位补0
2.1实例一:匹配12级保密1班的学生。
正则表达式是:
/^2012350101(?:0[1-9]|[1-2]\d|3[0-2])$/
分析
1."^"匹配开头,"$"匹配结尾,"|"表示或
2.?:匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用.
3.学生学号是01-32,所以拆分成3组:
a)01-09:0[1-9]
b)10-29:[1-2]/d
c)30-32:3[0-2]
2.2实例二:匹配11级保密和12级保密班的全体学生。
/^201(?:13501|235010)1(?:0[1-9]|[1-2]\d|3[0-2])$/
?:是小括号的专利,因为小括号里面的是一组字符
2.3实例三:匹配11级保密6个班和12级保密6个班的所有学生
/^201(?:13501|235010)[1-6](?:0[1-9]|[1-2]\d|3[0-2])$/
()表示把一些代码组合起来,[]表示把所有的字符组合起来
2.4实例四:匹配2001-2019级的所有学生(假设每个年级6个班,其中2011为分界线,2012级开始倒数第四位补0)
/^20(?:(?:0[1-9]|1[0-1])3501|1[2-9]35010)[1-6](?:0[1-9]|[1-2]\d|3[0-2])$/
分析
1.条件1-2规定了最后三位,也就是101-632,所以我们可以轻松想到1-6$这样可以匹配后三位,在这里面01 - 32可以分成3段:
a)01-09:0[1-9]
b)10-29:[1-2]/d
c)30-32:3[0-2]
2.然后我们看前面四位,由于特殊的年份是以11-12年分界的,所以我们说从第3位到倒数第4位都是特殊的,开头肯定是^20,然后里面根据情况可以分为补0的还是不补为的,所以可以得到(xxx3501|xxx35010),然后我们可以看到第一个XXX表示的是01-11,也即可以写成(?:0[1-9]|1[01]),第二个表示的是12-19,也即可以直接写成1[2-9],所以中间一部分是
(?:(?:0[1-9]|1[01])3501|1[2-9]35010)
3.最后:我们就可以得出一个看起来非常高大上的正则表达式了
/^20(?:(?:0[1-9]|1[0-1])3501|1[2-9]35010)[1-6](?:0[1-9]|[1-2]\d|3[0-2])$/
终于把这个看似高大上的一串正则表达式匹配出来了,其实只要仔细罗列好条件,正则表达式就是xx的oo次的无限组合。O(∩_∩)O~ ~