正则表达式的学习
常用的源字符
实际上.
这个元字符是不会匹配换行符的,所以不仅仅是\n
()
[]
{}
三种括号的作用
()
的作用是分组,或者是匹配()
中的所有字符,其实就是和数学上的小括号的作用一致,将多个单个字符捆绑起来使得其变成一个字符。
[]
的作用是字符种类。匹配方括号内的任意字符。
{}
的作用是字符出现的次数,{n,m}
匹配num个大括号之前的字符或字符集 (n <= num <= m).
字符集
上面提到了[]
可以包括一个字符集,使得正则表达式会去匹配其中的任意字符。
如:
1 |
|
方括号的句号就表示句号。 表达式 ar[.] 匹配 ar.字符串
"ar[.]" => A garage is a good place to park a car.
否定字符集
在[]
中使用^
就变成了否定的意思。
"[^c]ar" => The car parked in the garage.
重复次数
匹配前面的字符重复的次数
符号 | 作用 |
---|---|
+ | 等价于>=1 ,出现过1次以上 |
* | 等价于>=0 ,出现过0次以上 |
? | 出现过1次或者是0次 |
{}号
前面我们大致了解了{}
的作用。下面举几个例子
在正则表达式中 {} 是一个量词,常用来限定一个或一组字符可以重复出现的次数。 例如, 表达式 [0-9]{2,3} 匹配最少 2 位最多 3 位 0~9 的数字。
我们可以省略第二个参数。 例如,[0-9]{2,} 匹配至少两位 0~9 的数字。
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
在线练习
如果逗号也省略掉则表示重复固定的次数。 例如,[0-9]{3} 匹配3位数字
"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
()号
和数学上的()
的作用是差不多的。特征标群是一组写在 (...)
中的子模式。(...)
中包含的内容将会被看成一个整体,和数学中小括号()的作用相同。例如, 表达式 (ab)*
匹配连续出现 0
或更多个 ab
。如果没有使用 (...)
,那么表达式 ab*
将匹配连续出现 0
或更多个 b
。再比如之前说的 {} 是用来表示前面一个字符出现指定次数。但如果在 {}
前加上特征标群 (...)
则表示整个标群内的字符重复 N
次。
我们还可以在 ()
中用或字符 |
表示或。例如,(c|g|p)ar
匹配 car
或 gar
或 par
.
可以使用\num
来表示一个()
所匹配的字符
零宽度断言
先行断言和后发断言(合称 lookaround)都属于非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们需要一个模式的前面或后面有另一个特定的模式时,就可以使用它们。
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
?=
正先行断言
起作用就是:
“(T|t)he(?=\sfat)” => The fat cat sat on the mat.