一、字符类(一个字符,一位)
1、[ ] 由一对中括号包裹,取其中的任意一个字符
2、- 用于表示字符类的范围,这个字符只在[ ]内才有此意义
3、^ 用于对字符类进行反义,这个字符只在[ ]内才有此意义
4、一些在字符类外有特殊意义的元字符,如元字符 . 、管道符 | 、分组符 ( ) 、重复次数字符? + * { }、单词分隔符$,在字符类内部时仅表示一个普通的字符。
二、转义字符
1、/d 0-9任意一个数字
2、 /w 匹配一个单词字符:字母、数字、下划线、汉字,即可以出现在单词中的字符
3、/s 空格,制表符,回车或者换行中的任意一个字符
4、/D 任意一个非数字字符
5、/W 任意一个非字母、非数字、非下划线的字符
6、/S 任意一个非空字符
三、重复次数:{} ? * +
ab{4} 表示字符b重复4次,匹配字符串abbbb
ab{2,4} 表示字符b重复2到4次,匹配字符串abb或abbb或abbbb
ab? 表示字符b重复0到1次,匹配字符串ab或a
ab* 表示字符b重复0到无数次,匹配字符串a或ab或abb或abbb...
ab+ 表示字符b重复1到无数次,匹配字符串ab或abb或abbb...
四、元字符
1、. 任意一个字符
2、| 管道符,表示连接多种选择。
3、() 分组
五、单词边界:boundary
单词边界,用转义字符\b表示。指的是一个单词字符(\w)和一个非单词字符(\W)之间的边界。
单词边界并不是一个字符,它的宽度是0。它并不是一个具体的字符,不表示一个具体字符。
如,字符串 I have a dream中。I是一个单词字符,I之后的空格是一个非单词字符,在这两者之间就有一个边界。同理,在单词字符I之前也有一个边界,在最后一个单词dream后也有一个单词边界。
六、行边界:line boundaries
每一个文本块都会被分解成一行或者多行,行与行之间是以换行符分隔的。
行边界包括:行起始边界(^) + 行结束边界($)。
两个边界都不是字符,宽度为0。
行起始边界即每一行的第一个字符和它之前的换行符之间的边界。
行结束边界即每一行的最后一个字符和它之后的换行符之间的边界。
即一个文本块的构成如下:
(行起始边界) + 行 +(行结束边界) +
换行符 +
(行起始边界) + 行 +(行结束边界) +
换行符 +
...
(行起始边界) + 行 +(行结束边界)
- 正则表达式^a匹配的规则是:一个行起始边界,并且其后跟一个字符a。
- 正则表达式b$的匹配规则是:找到一个字符b,并且其后跟一个行结束边界。
- 正则表达式^ab$的匹配规则是:找到一个行起始边界,其后跟一个字符a,接着跟一个字符b,接着是一个行结束边界。
- 正则表达式^$的匹配规则是:找到一个空行。
七、捕获组与替换
正则表达 (\w*)ility 表示找到一个以 ility 结尾的单词,捕获组1就是匹配了部分内容的\w*。比如,如果我们的文本中包含 accessibility ,捕获组1就是accessib。如果我们的文本只含 ility ,那么捕获组1就是空字符串。
引用捕获组(获取捕获取的值):\1 \2 \3 \4 (反斜杠开头,后跟组序号)
一个正则表达式中可以包含多个捕获组,捕获组之间也可以嵌套。捕获组的编号是从左至右按照左圆括号的顺序依次编号。如对于正则表达式:(\w+) had a ( (\w+) \w+),如果文本内容是 I had a nice day。则:
捕获组1 (\1) 是 I。
捕获组2 (\2) 是 nice day。
捕获组3 (\3) 是 nice。
捕获取0 (\0) :在一些实现中,所有正则表达式都默认有一个捕获组0,它是匹配正则表达式的整个文本:即捕获组0 是 I had a nice day。
对于正则表达式 a(\w*) :
如果文本是 a,则捕获组1 (\1)是 空白。
如果文本是 ad,则捕获组1 (\1)是 d。
如果文本是 avocado,则捕获组1 (\1)是 v,捕获组0 (\0) 是 avocado 整个文本。
在替换需求中,可以引用捕获组来作为替换后的文本。比如:将所有MM/DD/YY格式的日期,替换成YYYY-MM-DD格式的。
查找MM/DD/YY格式的日期:\d\d/\d\d/\d\d,
分组,设置捕获组:(\d\d)/(\d\d)/(\d\d)
引用捕获组进行替换(用反斜杠加捕获组号来引用捕获组):20\3-\1-\2。
例如,如果日期是03/04/05,则捕获组1是03、捕获组2是04、捕获组3是05,被替换后的日期是:2005-03-04