1. 正则表达式规则
字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是\"普通字符\"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
举例1:表达式 \"c\",在匹配字符串 \"abcde\" 时,匹配结果是:成功;匹配到的内容是:\"c\";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)
举例2:表达式 \"bcd\",在匹配字符串 \"abcde\" 时,匹配结果是:成功;匹配到的内容是:\"bcd\";匹配到的位置是:开始于1,结束于4。
一些不便书写的字符,采用在前面加 \"\\\" 的方法。这些字符其实我们都已经熟知了。
|
表达式 |
可匹配 |
|
\\r, \\n |
代表回车和换行符 |
|
\\t |
制表符 |
|
\\\\ |
代表 \"\\\" 本身 |
还有其他一些在后边章节中有特殊用处的标点符号,在前面加 \"\\\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 \"^\" 和 \"$\" 字符,则表达式就需要写成 \"\\^\" 和 \"\\$\"。
|
表达式 |
可匹配 |
|
\\^ |
匹配 ^ 符号本身 |
|
\\$ |
匹配 $ 符号本身 |
|
\\. |
匹配小数点(.)本身 |
这些转义字符的匹配方法与 \"普通字符\" 是类似的。也是匹配与之相同的一个字符。
举例1:表达式 \"\\$d\",在匹配字符串 \"abc$de\" 时,匹配结果是:成功;匹配到的内容是:\"$d\";匹配到的位置是:开始于3,结束于5。
正则表达式中的一些表示方法,可以匹配 \'多种字符\' 其中的任意一个字符。比如,表达式 \"\\d\" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。
|
表达式 |
可匹配 |
|
\\d |
任意一个数字,0~9 中的任意一个 |
|
\\w |
任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个 |
|
\\s |
包括空格、制表符、换页符等空白字符的其中任意一个 |
|
. |
小数点可以匹配除了换行符(\\n)以外的任意一个字符 |
举例1:表达式 \"\\d\\d\",在匹配 \"abc123\" 时,匹配的结果是:成功;匹配到的内容是:\"12\";匹配到的位置是:开始于3,结束于5。
举例2:表达式 \"a.\\d\",在匹配 \"aaa100\" 时,匹配的结果是:成功;匹配到的内容是:\"aa1\";匹配到的位置是:开始于1,结束于4。
使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。
|
表达式 |
可匹配 |
|
[ab5@] |
匹配 \"a\" 或 \"b\" 或 \"5\" 或 \"@\" |
|
[^abc] |
匹配 \"a\",\"b\",\"c\" 之外的任意一个字符 |
|
[f-k] |
匹配 \"f\"~\"k\" 之间的任意一个字母 |
|
[^A-F0-3] |
匹配 \"A\"~\"F\",\"0\"~\"3\" 之外的任意一个字符 |
举例1:表达式 \"[bcd][bcd]\" 匹配 \"abc123\" 时,匹配的结果是:成功;匹配到的内容是:\"bc\";匹配到的位置是:开始于1,结束于3。
举例2:表达式 \"[^abc]\" 匹配 \"abc123\" 时,匹配的结果是:成功;匹配到的内容是:\"1\";匹配到的位置是:开始于3,结束于4。
前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。
使用方法是:\"次数修饰\"放在\"被修饰的表达式\"后边。比如:\"[bcd][bcd]\" 可以写成 \"[bcd]{2}\"。
|
表达式 |
作用 |
|
{n} |
表达式重复n次,比如:\"\\w{2}\" 相当于 \"\\w\\w\";\"a{5}\" 相当于 \"aaaaa\" |
|
{m,n} |
表达式至少重复m次,最多重复n次,比如:\"ba{1,3}\"可以匹配 \"ba\"或\"baa\"或\"baaa\" |
|
{m,} |
表达式至少重复m次,比如:\"\\w\\d{2,}\"可以匹配 \"a12\",\"_456\",\"M12344\"... |
|
? |
匹配表达式0次或者1次,相当于 {0,1},比如:\"a[cd]?\"可以匹配 \"a\",\"ac\",\"ad\" |
|
+ |
表达式至少出现1次,相当于 {1,},比如:\"a+b\"可以匹配 \"ab\",\"aab\",\"aaab\"... |
|
* |
表达式不出现或出现任意次,相当于 {0,},比如:\"\\^*b\"可以匹配 \"b\",\"^^^b\"... |
举例1:表达式 \"\\d+\\.?\\d*\" 在匹配 \"It costs $12.5\" 时,匹配的结果是:成功;匹配到的内容是:\"12.5\";匹配到的位置是:开始于10,结束于14。
举例2:表达式 \"go{2,8}gle\" 在匹配 \"Ads by goooooogle\" 时,匹配的结果是:成功;匹配到的内容是:\"goooooogle\";匹配到的位置是:开始于7,结束于17。
一些符号在表达式中代表抽象的特殊意义:
|
表达式 |
作用 |
|
^ |
与字符串开始的地方匹配,不匹配任何字符 |
|
$ |
与字符串结束的地方匹配,不匹配任何字符 |
|
\\b |
匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符 |
进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。
举例1:表达式 \"^aaa\" 在匹配 \"xxx aaa xxx\" 时,匹配结果是:失败。因为 \"^\" 要求与字符串开始的地方匹配,因此,只有当 \"aaa\" 位于字符串的开头的时候,\"^aaa\" 才能匹配,比如:\"aaa xxx xxx\"。
举例2:表达式 \"aaa$\" 在匹配 \"xxx aaa xxx\" 时,匹配结果是:失败。因为 \"$\" 要求与字符串结束的地方匹配,因此,只有当 \"aaa\" 位于字符串的结尾的时候,\"aaa$\" 才能匹配,比如:\"xxx xxx aaa\"。
举例3:表达式 \".\\b.\" 在匹配 \"@@@abc\" 时,匹配结果是:成功;匹配到的内容是:\"@a\";匹配到的位置是:开始于2,结束于4。
进一步说明:\"\\b\" 与 \"^\" 和 \"$\" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 \"\\w\" 范围,另一边是 非\"\\w\" 的范围。
举例4:表达式 \"\\bend\\b\" 在匹配 \"weekend,endfor,end\" 时,匹配结果是:成功;匹配到的内容是:\"end\";匹配到的位置是:开始于15,结束于18。
一些符号可以影响表达式内部的子表达式之间的关系:
|
表达式 |
作用 |
|
| |
左右两边表达式之间 \"或\" 关系,匹配左边或者右边 |
|
( ) |
(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰 |
举例5:表达式 \"Tom|Jack\" 在匹配字符串 \"I\'m Tom, he is Jack\" 时,匹配结果是:成功;匹配到的内容是:\"Tom\";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:\"Jack\";匹配到的位置时:开始于15,结束于19。
举例6:表达式 \"(go\\s*)+\" 在匹配 \"Let\'s go go go!\" 时,匹配结果是:成功;匹配到内容是:\"go go go\";匹配到的位置是:开始于6,结束于14。
举例7:表达式 \"¥(\\d+\\.?\\d*)\" 在匹配 \"$10.9,¥20.5\" 时,匹配的结果是:成功;匹配到的内容是:\"¥20.5\";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:\"20.5\"。
2. 正则表达式中的一些高级规则
在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:\"{m,n}\", \"{m,}\", \"?\", \"*\", \"+\",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 \"dxxxdxxxd\",举例如下:
|
表达式 |
匹配结果 |
|
\"\\w+\" 将匹配第一个 \"d\" 之后的所有字符 \"xxxdxxxd\" |
|
|
\"\\w+\" 将匹配第一个 \"d\" 和最后一个 \"d\" 之间的所有字符 \"xxxdxxx\"。虽然 \"\\w+\" 也能够匹配上最后一个 \"d\",但是为了使整个表达式匹配成功,\"\\w+\" 可以 \"让出\" 它本来能够匹配的最后一个 \"d\" |
由此可见,\"\\w+\" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 \"d\",但那也是为了让整个表达式能够匹配成功。同理,带 \"*\" 和 \"{m,n}\" 的表达式都是尽可能地多匹配,带 \"?\" 的表达式在可匹配可不匹配的时候,也是尽可能的 \"要匹配\"。这 种匹配原则就叫作 \"贪婪\" 模式 。
非贪婪模式:
在修饰匹配次数的特殊符号后再加上一个 \"?\" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 \"不匹配\"。这种匹配原则叫作 \"非贪婪\" 模式,也叫作 \"勉强\" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 \"dxxxdxxxd\" 举例:
|
表达式 |
匹配结果 |
|
\"\\w+?\" 将尽可能少的匹配第一个 \"d\" 之后的字符,结果是:\"\\w+?\" 只匹配了一个 \"x\" |
|
|
为了让整个表达式匹配成功,\"\\w+?\" 不得不匹配 \"xxx\" 才可以让后边的 \"d\" 匹配,从而使整个表达式匹配成功。因此,结果是:\"\\w+?\" 匹配 \"xxx\" |
更多的情况,举例如下:
举例1:表达式 \"<td>(.*)</td>\" 与字符串 \"<td><p>aa</p></td> <td><p>bb</p></td>\" 匹配时,匹配的结果是:成功;匹配到的内容是 \"<td><p>aa</p></td> <td><p>bb</p></td>\" 整个字符串, 表达式中的 \"</td>\" 将与字符串中最后一个 \"</td>\" 匹配。
举例2:相比之下,表达式 \"<td>(.*?)</td>\" 匹配举例1中同样的字符串时,将只得到 \"<td><p>aa</p></td>\", 再次匹配下一个时,可以得到第二个 \"<td><p>bb</p></td>\"。
表达式在匹配时,表达式引擎会将小括号 \"( )\" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 \"<td>(.*?)</td>\"。
其实,\"小括号包含的表达式所匹配到的字符串\" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 \"括号内的子匹配已经匹配到的字符串\"。引用方法是 \"\\\" 加上一个数字。\"\\1\" 引用第1对括号内匹配到的字符串,\"\\2\" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 \"(\" 在前,那这一对就先排序号。
举例如下:
举例1:表达式 \"(\'|\")(.*?)(\\1)\" 在匹配 \" \'Hello\', \"World\" \" 时,匹配结果是:成功;匹配到的内容是:\" \'Hello\' \"。再次匹配下一个时,可以匹配到 \" \"World\" \"。
举例2:表达式 \"(\\w)\\1{4,}\" 在匹配 \"aa bbbb abcdefg ccccc 111121111 999999999\" 时,匹配结果是:成功;匹配到的内容是 \"ccccc\"。再次匹配下一个时,将得到 999999999。这个表达式要求 \"\\w\" 范围的字符至少重复5次,注意与 \"\\w{5,}\" 之间的区别。
举例3:表达式 \"<(\\w+)\\s*(\\w+(=(\'|\").*?\\4)?\\s*)*>.*?</\\1>\" 在匹配 \"<td id=\'td1\' style=\"bgcolor:white\"></td>\" 时,匹配结果是成功。如果 \"<td>\" 与 \"</td>\" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。
继续阅读与本文标签相同的文章
Android打包的基础
-
将制造业作为发展数字经济的主战场!
2026-05-18栏目: 教程
-
如何成为一名优秀的初级开发者?
2026-05-18栏目: 教程
-
展望2025多媒体技术与应用趋势
2026-05-18栏目: 教程
-
“拼下限”的网络直播
2026-05-18栏目: 教程
-
阿里云第六代云服务器特性、实例类型、及可选区域相关介绍
2026-05-18栏目: 教程
