正则表达式的学习

创建时间:2015/12/10

修改时间:


先推荐几个学习正则表达式的好的网址:


1. 基本语法

一个正则表达式就被称为一种模式 ( pattern ),用来匹配符合该模式的字符串。

  • 选择

    | 竖直分隔符表示选择。例如 “gray” | “gray” 可以表示是 “gray” 还是 “grey” .

  • 数量限定符

    数量限定符用来规定前面的字符出现的次数,常用的数量限定符有 “+” 、 “?” 、 “*” ,当然如果字符后面没有数量限定符的话,那么就表示字符只出现一次(这好像是废话呀!)

  • “+“ 表示字符至少出现一次,也就是出现一次或多次。比如说: “gra+y” 则可以匹配 “gray” 、 “graay” 、 “graaaaay” ……
  • “?” 表示字符至多出现一次,也就是出现零次或一次。例如: “gra?y” 则可以匹配 “gry” 、 “gray” (这就没有……了,只存在这两种)
  • “*“ 表示字符可以出现零次、一次或多次。其实,如果有了解过 闭包 这个概览的话,那么 “*” 就表示是字符集合的 闭包) 。
  • 匹配

圆括号用来定义操作符的范围和优先度。比如说: “gr(a|e)y” == “gray|grey” , “gr(ae?|b)y” == “gr(a|ae|b)y”

上面讲到了”*“这个数量限定符号,我们需要跟模式匹配的”*“分开 通常我们会用到模式匹配的地方,比如说: “name_.xml” ,表示所有带 “name_“ 的 xml 文件,匹配的可以有 “name_abcd.xml” 、 “name_abcdefg.xml” 、等等。在这里 “\“ 就不是数量限定的意思,而是替代的意思,在上面的例子中 “*” 就可以替代 “abcd” 、”abcdefg” ……

讲了这么多,可能我们大概能了解到“正则表达式”是个什么东东了。也就是用多种元字符和规定的运算符组成的小的表达式来表示更大、更复杂的字符串。

2.字符

下面,我们就要学习一下表达式中的字符,正则表达式就是由这次字符组合而成。正则表达式中包含:普通字符和特殊字符(我的理解就是相当于数学表达式中的运算字符)。

特殊字符就是由特殊含义的字符,例如限定符号、定位符……。当在匹配特殊字符的时候,要先对特殊字符进行转义。例如 “a*?” 就表示找 ‘a’ 后面有零个或者一个’*’的字符串。

2.1 普通字符

普通字符就是常见的大小写字母、数字和标点符号,当然还有一些其它的字符(就是非打印字符、特殊字符、限定符、定位符的其它字符,唉!理解就好。)。

2.2 非打印字符

非打印字符,大多是一些转义字符,带有转义符号 “\” 。

字符 描述
\cx 匹配由x指明的控制字符。比如 \cM 就匹配Control-M或则是转义符.x只能是大小写字母,否则会将c看作是一个普通字符
\f 匹配一个换页符。
\n 匹配一个换行符。
\s 匹配一个空白符,包括空格、制表符、换页符等等。
\S 匹配一个非空白符。
\t 匹配一个制表符。
\v 匹配一个垂直制表符。

2.3 限定符

限定符表示正则表达式中的某个组件必须出现多少次才能满足匹配。除了基本语法中介绍的三种数量限定符 ‘*’ 、’+’ 、’?’ 外(大家应该还记得这三个符号的意思吧?),还有三种方式。

字符 描述
{n} n是一个非负整数。匹配确定的n次。例如: “fo{2}” 表示 “foop” , 而不能匹配其它。
{n,} n是一个非负整数。匹配 n 次及 n 次以上。例如: “fo{2,}p” 可以匹配 “foop” 、”fooop” 、”foooop”……而不能匹配 “fop”。
{n,m} n 和 m 都是非负整数,且 n < m 。表示匹配至少 n 次,至多 m 次。

值得注意的是: ‘?’ 、’+’ 、’*’ 表示的都是“贪婪”匹配,也就是会尽可能多的匹配,只有在它们的后面加上’?’,才能变成非贪婪匹配或者是最小匹配

2.4 定位符