1. 什么是正则表达式
基本说来,正则表达式是一种用来描述一定数量文本的模式。 Regex 代表 Regular Express 。
在编写处理字符串的程序 或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式 就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码 。
2. 正则表达式中的特殊字符
[ ] / ^ $ . | ? * + ( )
这些特殊字符也被称作元字符。
如果你想在正则表达式中将这些字符用作文本字符,你需要用反斜杠“ / ”对其进行换码 (escape) 。例如你想匹配“ 1+1= 2 ” ,正确的表达式为 <<1/+1=2>>.
需要注意的是, <<1+1=2>> 也是有效的正则表达式。但它不会匹配“ 1+1= 2 ” ,而会匹配“ 123+111= 234 ” 中的“ 111=2 ”。因为“ + ”在这里表示特殊含义(重复 1 次到多次)。
在编程语言中,要注意,一些特殊的字符会先被编译 器处理,然后再传递给正则引擎。因此正则表达式 <<1/+2=2>> 在 C++ 中要写成“ 1//+1= 2 ” 。为了匹配“ C:/temp ”,你要用正则表达式 <<C://temp>> 。而在 C++ 中,正则表达式则变成了“ C:////temp ”。
3. 元字符描述
. 匹配任何单个字符。例如正则表达式 r.t 匹配这些字符串: rat 、 rut 、 r t ,但是不匹配 root 。
$
匹配行结束符。例如正则表达式 weasel$ 能够匹配字符串 "He's a weasel" 的末尾,但是不能匹配字符串 "They are a bunch of weasels." 。
^
匹配一行的开始。例如正则表达式 ^When in 能够匹配字符串 "When in the course of human events" 的开始,但是不能匹配 "What and When in the" 。
*
匹配 0 或多个正好在它之前的那个字符。例如正则表达式 .* 意味着能够匹配任意数量的任何字符。
[ ]
匹配括号中的任何一个字符。例如正则表达式 r[aou]t 匹配 rat 、 rot 和 rut ,但是不匹配 ret 。可以在括号中使用连字符 - 来指定字符的区间,例如正则表达式 [0-9] 可以匹配任何数字字符;还可以制定多个区间,例如正则表达式 [A-Za-z] 可以匹配任何大小写字母。另一个重要的用法是 “ 排除 ” ,要想匹配除了指定区间之外的字符 —— 也就是所谓的补集 —— 在左边的括号和第一个字符之间使用 ^ 字符,例如正则表达式 [^269A-Z] 将匹配除了 2 、 6 、 9 和所有大写字母之外的任何字符。
( )
将 ( 和 ) 之间的表达式定义 为 “ 组 ” ( group ),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存 9 个),它们可以用
到
的符号来引用。
|
将两个匹配条件进行逻辑 “ 或 ” ( Or )运算。例如正则表达式 (him|her) 匹配 "it belongs to him" 和 "it belongs to her" ,但是不能匹配 "it belongs to them." 。注意:这个元字符不是所有的软件 都支持的。
+
匹配 1 或多个正好在它之前的那个字符。例如正则表达式 9+ 匹配 9 、 99 、 999 等。注意:这个元字符不是所有的软件都支持的。
?
匹配 0 或 1 个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。
{i} {i,j}
匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式 A[0-9]/{3/} 能够匹配字符 "A" 后面跟着正好 3 个数字字符的串,例如 A123 、 A348 等,但是不匹配 A1234 。而正则表达式 [0-9]/{4,6/} 匹配连续的任意 4 个、 5 个或者 6 个数字字符。