笔者在练习PAT时发现自己对正则表达式的知识点仍然掌握不够,因此决定重新梳理一遍 。
一、为什么使用正则表达式?
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。但其缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
a、测试字符串内的模式。--如电话号码模式或信用卡号码模式,这称为数据验证。
b、替换文本。可以使用正则表达式来识别文档中的待定文本。
c、基于模式匹配从字符串中提取子字符串。可以查找文档内待定的文本。
二、正则表达式-语法。
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式是由普通字符以及特殊字符(称为“元字符”)组成的文字模式。
普通字符包括没有显示指定为元字符的所有可打印和不可打印字符。包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
非打印字符
字符 | 描述 |
\cx | 匹配由x指明的控制字符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符。等价于\xOc和\cL |
\n | 匹配一个换行符。 |
\r | 回车符 |
\s | 匹配任何空白符 |
\S | 匹配任何非空白字符,包括空格、制表符、换页符等 |
\t | 制表符 |
\v | 垂直制表符 |
特殊字符
所谓特殊字符,就是一些有特殊含义的字符,简单的说就是表示任何字符串的意思。如果需要查找这些字符则需要对 * 进行转义。
1、$:匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配'\n'或'\r'。要匹配$字符本身,请使用\$.
2、():标记一个子表达式的开始和结束位置。
3、*:匹配前面的子表达式一次或者多次。
4、+:匹配前面的子表达式一次或多次。
5、. :匹配除换行符之外的任何单字符。
6、[ :标记一个中括号表达式的开始。
7、?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
8、\ :将下一个字符标记为特殊字符、原义字符、或向后引用、或八进制转义符。
9、^ :匹配字符串的开始位置。
10、{: 标记限定符表达式的开始。
11、| :指明两项之间的一个选择。
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
正则表达式的限定符有:
字符 描述
1、* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
2、+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
3、? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
4、{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
5、{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
6、{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。