正则表达式
正则表达式又称规则表达式,它的英文名是Regular Expression,在代码中通常简写为regex、regexp或者是RE。正则表达式经常被用来检索和替换那些符合某个规则模式的文本。简单来说,正则表达式就是用来进行文本匹配的工具,是用来记录文本规则的代码。
一、元字符
元字符是正则表达式规定的一种特殊的代码。它具有如下几种:
1、.(英文状态的句号)表示匹配的是除换行符以外的任意字符;
2、\w表示匹配的是数字、字母、下划线以及汉字;
3、\s表示匹配的是任意空白符(空格、tab键、换行符、中文全角空格等);
4、\d表示匹配的是数字;
5、\b表示匹配的是单词的开头或结尾(即单词的分界处,匹配的是一个位置而不是某一个字符);
6、^(和数字6在同一个键的符号)表示匹配的是字符串的开始位置;
7、$匹配的是字符串的结束位置。
二、转义字符(\)
1、当我们想要查找到元字符本身的时候,例如当我们查找时,就会出现我们无法指定它们的问题,这是因为元字符会被解释成其他意思。
2、所以这时我们就需要引进转义字符了,用转义字符来取消元字符的特殊意义后,我们才能查找到元字符本身。转义字符的符号是“\”,当我们查找时,应用*。要查找\时,也应用\。
三、常用限定符(重复)
1、表示重复零次或更多次;
2、+表示重复一次或更多次;
3、?表示重复零次或一次;
4、{n}表示重复n次;
5、{n,}表示重复n次或更多次;
6、{n,m}表示重复n到m次。(即重复的次数不能少于n次,也不能多于m次,而且先尽可能的去匹配最长的次数m,再匹配余下的,如余下的次数不在n到m中则都不匹配。)
四、字符类([指定范围])
1、现在我们要想查找数字、字母、空白等是很简单的,因为它们都有对应的元字符了;但是如果我们想查找那些没有预定义了元字符的字符集合,例如元音字母a,o,e,i,u时,我们应该怎么做呢?
2、这时,我们就需要讲到指定一个字符范围的字符类了;我们只需要在中括号里列出我们要查找的字符就可以了。像[a,o,e,i,u]就会匹配出任何一个英文元音字母。像[0-9]代表的含义与\d是完全相等的,都是匹配数字。
五、反义
有时候我们想要查找不属于某个能简单定义的字符类的字符。例如查找除了空白符以外的任意字符的情况,这时我们需要用到反义。
1、\W表示匹配除了数字、字母、下划线以及汉字以外的任意字符;
3、\S表示匹配除了空白符(空格、tab键、换行符、中文全角空格等)以外的任意字符;
4、\D表示匹配除了数字以外的任意字符;
5、\B表示匹配不是单词的开头或结束的位置;
6、[^x] 表示匹配除了x以外的任意字符;
7、[^aeiou] 表示匹配除了aeiou这几个字母以外的任意字符。
例如:<a[^>]+>表示匹配用尖括号括起来的以a开头的字符串。
六、替换(|)
1、正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体的方法是使用竖线(|)把不同的规则分隔开。
2、我们要着重注意的是:在使用替换时,顺序是非常重要的。
例如:\d{5}-\d{4}|\d{5}
这个表达式是用于匹配美国的邮政编码的。而美国邮编的规则是5位数字,或者用连字号间隔的9位数字。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
3、而会出现这样的结果的原因是:匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝条件,那么就不会再去管其它的替换条件了。
七、分组语法
1、我们可以用小括号来指定子表达式,也叫做分组,这样之后就可以指定这个子表达式的重复次数了。
2、分组语法具有捕获、零宽断言以及注释等语法;但我们现在主要是讲零宽断言。
3、以下四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西。
(1)(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。
(2)(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。
(3)(?!exp)也叫零宽度负预测先行断言,它断言此位置的后面不能匹配表达式exp。
(4)(?<!exp)也叫零宽度正回顾后发断言,它断言此位置的前面不能匹配表达式exp。
4、前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办呢?
5、这时,我们就需要使用负向零宽断言了。这是因为负向零宽断言只匹配一个位置,并不消费任何字符。在上面的四种零宽断言中,负向零宽断言就是(?!exp)和(?<!exp)。
八、贪婪与懒惰
1、当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这被称为贪婪匹配。
2、但有时,我们却更加需要懒惰匹配,也就是匹配尽可能少的字符。如果将前面给出的限定符都转化为懒惰匹配模式,只需要在它后面加上一个问号(?)就可以了。
3、以下是懒惰限定符:
(1)?表示重复任意次,但尽可能少重复;
(2)+?表示重复1次或更多次,但尽可能少重复;
(3)?? 表示重复0次或1次,但尽可能少重复;
(4){n,m}?表示重复n到m次,但尽可能少重复;
(5){n,}? 表示重复n次以上,但尽可能少重复。