正则表达式
1、概念:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。换句话说,正则表达式就是记录文本规则的代码。
正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。
1)、元字符
元字符就是指那些在正则表达式中具有特殊意义的专用字符。可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符,匹配任意的空白符(包括空格、制表符(Tab)、换行符、中文全角空格等)
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
* 代表的不是字符,也不是位置,而是数量。它指定*前边的内容可以连续重复使用任意次(可能是0次)以使整个表达式得到匹配
.* 匹配任意数量的不包含换行的字符
+ 匹配重复1次或更多次
2)、字符转义
\ 取消字符的特殊意义
3)、重复
限定符,即指定数量的代码
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
4)、分枝条件
分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开,但要注意各个条件的顺序
5)、分组(子表达式)
重复多个字符,可以用小括号 () 来指定分组。
默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
常用分组语法
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#注释内容) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
6)反义
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
7)、后向引用
用于重复搜索前面某个分组匹配的文本
8)、零宽断言
只有当断言为真时才会继续进行匹配
零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西
(?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
(?<=exp) 也叫零宽度正回顾后发断言
9)、负向零宽断言
10)、注释
(?#注释内容)
11)、贪婪与懒惰
贪婪匹配:匹配尽可能多的字符
懒惰匹配:匹配尽可能少的字符。
正则表达式默认贪婪匹配,由贪婪匹配转化为懒惰匹配在后面加上一个问号 ?
懒惰限定符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
12)、平衡组/递归匹配