正则表达式
. 1个字符。
? 可能没有,也可能有一个。0或1个字符。
- 任意个前面的字符。0到*。
- 至少一个,没有?给你加一个。1到*。
-
正则表达式可以只包含普通的文本,代表去精确匹配这个文本。
-
正则表达式默认是区分大小写的,所以song 不会匹配 "Song" 。但是大部分的正则表达式
实现都提供了一个选项表示不区分大小写。 -
. 用来匹配一个任意字符。
多个连续的 . 可以匹配多个连续的任意字符。 -
. 在正则表达式中含有特殊的意义,是一个特殊的字符。\ 也是特殊字符,可以对特殊
字符起到转义作用。如果你想匹配的是一个真正的" . "字符,需要在. 前面加上\ 对字符
进行转义。所以, . 表示真正的" . "字符。 -
匹配一组(几个)特定的字符可以使用 [ 和 ] 元字符。
[ab] 会匹配" a "或者" b "。 -
字符组区间。
c[a‐z]t 表示以 "c" 开头,"t" 结尾,中间为字母 "a" - "z" 的任意一个字母。 -
[a‐z] 匹配所有的小写字母,而 [^a‐z] 匹配所有的不是小写字母的字符。
^ 字符是将字符集合中的所有字符都取消匹配。 -
[\b] 退格符
\f 换页符
\n 换行
\r 回车
\t 制表符
\v 垂直制表符
例如\r\n 将匹配一个回车换行组合,在 Windows 中表示一个文件换行。
在 Linux 和 Unix 系统中,只需要使用 \n 即可。 -
\d 任何数字 (同 [09])
\D 任何非数字 (同 [^09])
\w 所有的文字数字式字符:大小写字母、数字和下划线 (同 [azAZ09_])
\W (同 [^azAZ09_])
\s 所有的空白字符 (同 [\f\n\r\t\v])
\S 所有的非空白字符 (同 [^\f\n\r\t\v]) -
+
匹配【一个】或【多个】字符。例如, a 将匹配"a",而a+ 则匹配一个或者多个"a"。
在字符集合上使用+ 的时候,需要将+ 符号放在集合外面。c[0‐9]+t 表示以 "c"开头,以"t"结尾,中间为一个或多个数字的字符串。
[0‐9+] 也是一个合法的正则表达式,但它表示一个包含 " 0 " - " 9 " 和 " + " 符号的字符集合。 -
一般的,元字符如. 和+ 等用于字符集合的时候是作为字面含义使用的,因此没有必要转义。但是对其进行转义也没错,所以, [0‐9+] 和[0‐9+] 的功能是一样的。
-
*
匹配【零个】或【多个】「某字符」的时候,可以将 * 元字符放在「某字符」后面。 -
? 匹配【零个】或【一个】字符。所以, ? 非常适合于在文本中匹配一个可选的字符。
-
使用匹配次数。正则表达式允许指定匹配的次数。次数可以在“ { ”和“ } ”之间指定。
-
{3} 将匹配 3 次前面出现的字符或集合。
{2,} 意味着匹配 2次或者更多次。
{2,3} 意味着最少匹配 2次,最多匹配3次。 -
贪婪匹配。
s.g并没像预想中的匹配两个" song ",而是匹配了第一个" s "和最后一个 " g "之间的所有文本。
song xiao song
因为和+都是贪婪匹配。也就是说,正则表达式总是寻找最大的匹配,而不是最小的,这是故意设计的。 -
?号用于构建非贪婪匹配。
非贪婪量词是在量词后面加上?
贪婪量词 非贪婪量词
*
*?
+
+?
{n,} {n,}? -
字符串边界匹配的元字符是^和$,分别用于字符串的开始和结束。
^如果位于集合开始处的话,则表示否定;如果在集合外面,则将匹配字符串的开始位置。
大家可以试试[0-9]和[0-9]的区别。 -
模式重复。子表达式。
通过(和)括起来的就是子表达式。
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
(\d{1,3}.){3}\d{1,3} -
模式分组。子表达式。
19|20\d{2}用来定位一个前两个数字只能为19或者20的四位数的年份。但是很显然这个正则并没有实现预想的效果。|操作符从左到右读取,将19|20\d{2}分析为要么19,要么20\d{2},也就是匹配数字19或者20开头的四个数字字符。
解决方法是将19|20作为一个子表达式,(19|20)\d{2}就能够匹配所有19和20开头的四个数字了。 -
嵌套子表达式。
匹配所有的合法 IP 地址:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])).){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])) -
后向引用。(用时再看)
采用 <H1> 开始而采用 </H6> 的标题标签是非法的,但是现在的模式可以匹配。问题在于匹配的第二个部分(匹配结束的标签)没有办法知道匹配第一部分(匹配开始的标签)是什么。这时候就需要后向引用了。