正则表达式

正则表达式

1. 限定符

限定符用来指定正则表达式的一个给定组件要出现多少次才能满足匹配,共有*?+{n}{n,}{n,m}六种,他们的描述如下:(限定出现次数)

字符 描述
* 匹配前面的子表达式零次或多次,等价于{0,}
+ 匹配前面的子表达式一次或多次,等价于{1,}
匹配前面的子表达式零次或一次,等价于{0,1}
{n} n是一个非负数,匹配确定的n次
{n,} 至少匹配n次
{n,m} 最少匹配n次且最多匹配m次。注意在逗号和两个数之间不能有空格。

注意:*+都是贪婪的,他们会尽可能匹配多的文字,只有在它们后面加上一个?就可以实现非贪婪匹配。

2. 普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有的大小写字母、所有的数字、所有的标点和一些其他符号。

3. 非打印字符

4. 特殊字符

特殊字符是一些有特殊含义的字符。

特殊字符 描述
$ 匹配输入字符串的结尾位置
() 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次,或指明一个非贪婪的限定符
. 匹配除换行符之外的任何单字符
[ 标记一个中括号表达式的开始
\ 将下一个字符标记为或特殊字符、或原意字符、或向后引用、或八进制转义符。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,表示不接受该字符集合
{ 标记限定符表达式的开始
| 指明两项之间的一个选择

当你想匹配表格中列举的特殊字符的话,请在该字符前面加上\

5. 定位符

定位符使得能够将正则表达式固定到行首或行尾,还能创建出现在一个单词内,在一个单词开头或者结尾的表达式,

定位符用于描述字符串或单词的边界,^$分别标记字符串的开始和结尾。\b描述单词的前或后边界,\B表示非单词边界。

定位符有:

定位符 描述
^ 匹配输入字符串开始的位置。
$ 匹配输入字符串结束的位置。
匹配一个单词边界,即字与空格之间的位置。
非单词边界匹配

注意: 不能将限定符和定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上的位置。

6. 选择

用圆括号将所有的选择项括出来,相邻的选择项用|分隔,但用圆括号会使相关的匹配被缓存(什么是缓存?),因此可以放一个?:放在选择项前消除这种副作用。

7. 反向引用

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。可以使用非捕获元字符?:, ?=, ?! 来重写捕获,忽略对相关匹配的保存。

匹配规则

1. 基本匹配模式

从最基本的开始。模式 是正则表达式的最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,也可以很复杂,如:

1
2
3
^once
once$
^once$

该模式包含一个特殊字符^,匹配那些以once开头的字符串。$匹配以该模式结尾的字符串。而当二者同时使用时,代表精准匹配一个模式。

如果一个模式不包括^ $, 那么它与任何包含该模式的字符串匹配,例如:

1
once

与字符串

1
2
There once was a man from NewYork
Who kept all of his cash in a bucket.

都是匹配的。

2. 字符族

可以用方括号来表示字符族,如,以下元音字符族:

1
[AaEeIiOoUu]

以及表示范围的字符族

1
2
3
4
5
[a-z] //匹配所有的小写字母 
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号

这些字符族只表示一个字符。如我们要匹配又一个小写字母加一位数字组成的两位的字符串,可以用以下这个模式:

1
^[a-z][0-9]$

这里的^表示字符串开头,但是在一组方括号中使用^时,表示“非”和“排除”的意思,即不能包含该字符如: ^[^0-9][0-9]$表示第一位不能为数字