正则表达式
1.先来几个案例试试水
先来看看几个常用的案例。
手机号码正则表达式: /^1[345789][0-9]{9}$/
解释:
最外的/.../是正则的表达式的标志,
^:表示以什么开头,
[]:表示哪些可选项,
{}:表示出现几次,
$:以什么结尾。
手机号案例:以1开头,第2位为[3,4,5,7,8,9]中任一,【第2位为0~9任意一位,循环9次】也就是第3位到第11位为任意数字。
日期的正则表达式: /^\d{4}[/-]\d{2}[/-]\d{2}$/
解释:
最外的//是正则的表达式的标志,
^:表示以什么开头,
\d:表示为数字,
{}:表示出现几次,
/-:表示 - ,
$:表示结尾。
日期案例:4位数字-2位数字-2位数字
2.正则表达式语法
修饰符
修饰符与其他语法特殊,字面量方法声名的时候放到/…/后,构造函数声明的时候,作为第二个参数传入。整个正则表达式可以理解为正则表达式规则字符串+修饰符。
(1)g:global
执行一个全局匹配。不加g只匹配第一个。
(2)i:ignore case
忽略大小写进行匹配。
(3):multiple lines
多行匹配
元字符
( * + ? $ ^ . | \ () {} [] )
原义字符
例如我们要匹配的is 或 别的字符
\ 将下一个字符标记为特殊字符、或一个原义字符、或一个向后引用、或一个进制转义符。例如:【\n】 匹配 一个换行符 【/】匹配一个/ 。
非打印字符
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个换行符。等价于\x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等。 等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。 等价于[ ^ \f\n\r\t\v]。
\t 匹配一个制表符。 等价于 \x09 和 \cl 。
\v 匹配一个垂直制表符。 等价于 \x0b 和 \cK
字符类
[可以表示匹配数字] :[13579] :【任意从13579取一】
[可以表示某些字符]:[//] :【//】
[^ 可以表示取反]:[ ^ 13579]:【任意从02468取一】
[ - ]:[a-zA-Z0-9]:【从a-z,A-Z,0-9中任意取】
预定义类
. :[ ^ \n\r] :除了回车符和换行符之外的所有字符
\d :[0-9]:数字字符
\D :[ ^ 0-9]:非数字字符
\s :[\t\n\x0B\f\r]:空白符
\S :[ ^ \t\n\x0B\f\r]:非空白符
\w:[a-zA-Z_0-9] :单词字符(字母、数字、下划线)
\W:[ ^ a-zA-Z_0-9]:非单词字符
边界
^ :以xx开头。
$ :以xx结尾。
\b:单词边界,指[a-zA-Z_0-9]之外的字符。
\B:非单词边界。
量词
?:出现0次或1次。
*:出现任意次。
+:出现一次或多次(至少一次)。
{n}:对应0次或n次。
{n, m}:至少出现n次到不超过m次。
{n,}:至少出现n次。
{0,n}:至多出现n次。
贪婪与懒惰(非贪婪)
见名思意 贪婪就是尽可能多的匹配,懒惰就是尽可能少的去匹配。
在修饰匹配次数的特殊符号(+、*、{m,n})后再加上一个 “?” 号,就由贪婪模式变成懒惰模式。
贪婪
正则式 | 源字符 | 匹配结果 |
---|---|---|
(J)(\w+) | “Jaaaaay Jay Ja” | 匹配第一个J后的所有元素“Jaaaaay Jay Ja” |
(J)(\w+)(J) | “Jaaaaay Jay Ja” | 匹配第一个和最后一个J之间的元素"Jaaaaay Jay J" |
懒惰
正则式 | 源字符 | 匹配结果 |
---|---|---|
(J)(\w+?) | “Jaaaayzzz Jay” | “Ja” |
(d)(\w+?)(d) | “daadccd” | “daad” |
3.练习一下
匹配出生日期
出生日期的写法有很多种,例如[1997-04-15]、[1997年4月15日]、[1997/4/15]、[1997-04]等等
如何把这些全部匹配进来呢
line = "xzy出生于1997年4月15日"
line = "xzy出生于1997-04-15"
line = "xzy出生于1997-04"
line = "xzy出生于1997/4/15"
line = "xzy出生于1997年4月"
reg = ".*出生于(\d{4}[年-/]\d{1,2}([月]$|[月-/]\d{1,2}([日]|$)|$))"
强行解释一波
.*就代表任意字符出现任意次数
\d代表数字,{4}代表出现几次,[年/-]表示可选项。 也就是匹配年份
\d{1,2} 表示匹配月份可能是4 也可能是 04,但是有些只到月没有日 有些还有日,所以要再加判断.
[月]$: 这是考虑最后一种情况 只到月份 [1997年4月]
[月-/]\d{1,2}: 这是包含日的情况