来自:《精通正则表达式》
*
表示任意文本
?
表示任意单个字符
.
表示1个或多个字符
通用的模式语言 :generalized pattern language
行的起始和结束:
^
代表一行的开始
$
代表一行的结束
例如: ^cat
,匹配的是以c作为一行的第一个字符,紧接一个a,紧接一个b
^ 和 $ 符合特别之处在于,它匹配的是一个位置,而不是具体的文本
分析^cat## 、
## 和^
-
^cat$
匹配,行开头(显然,每一行都有开头),然后是字母c ,a,t,然后是行末尾
-
$
匹配,行开头,然后是行末尾
应用:空行(没有任何字符,包括空白字符)
-
^
匹配:行开头
应用:无意义!
不妨把字符组看作独立的微型语言。在字符组内部和外部,关于元字符的规定(哪些是元字符,以及他们的意义)是不同的
^
在字符组外部表示一个行锚点(line anchor),但是在字符组内部(而且必须是紧挂载字符组的第一个方括号之后),他就是个元字符
为什么 q[^u]
,无法匹配Qantas
或者raq
Qantas
无法匹配的原因是:正则表达式要求小写q,而Qantas中的Q是大写的。应该用[Qq][^u]
- raq 的例子有点迷惑人。正则表达式要求 q 后面紧跟一个u以外的字符,这就排除了q在行位的情况。通常来说,文本行的结尾有一个换行符字符,但是egrep 会在检查正则表达式之前把这些换行符去掉,所以在行尾的q后,没有能够匹配u以外的字符。
通过这个例子要认识到:一个字符组即使是排除型字符数组,也需要匹配一个字符
字符组
-
匹配若干字符之一
[...]
[1-6]、[a-z]、简便写法,匹配1-6和a-z的任意字符之一
注意:只有在字符组内部(
[]
),连字符-
才是元字符,否则它就是普通的-
字符,如果-
出现在开头 它表示一个普通字符 -
排除型字符组
[^...]
[^1-6]
匹配除了1-6以外的任意字符 -
用点号表示任意字符
[.]
搜索: 03/19/76、03-19-76或 03.19.76
精确写法:
03[-./]19[-./]76
不精确写法:
03.19.76
(易于理解,但是也会匹配到 03 19 76)
多选结构
匹配任意子表达式 |
^(From|subject|Date):*
匹配以 From:,subject:Date:开头的文本行
可选元素
?
作用于之前紧邻的元素
colou?r
先是一个c,然后是o,然后是l,然后是o,然后是u,然后是一个任意字符,最后是 r
其他量词
+
,表示之前紧邻的元素出现一次或者多次
*
表示之前紧邻的元素出现任意多次(或者不出现)
\
转义字符
实例
-
匹配变量名:只包含字母、数字以及下划线,不能以数字开头
[a-zA-z_][a-zA-z_0-9]*
-
引号内的字符
"[^"]*"
-
美元金额
\$[0-9]+(\.[0-9][0-9])?
-
Http/HTML URL
\<http://[-a-z0-9_.:]+/[a-z-0-9_:@&?=+,.!/~*%$]*\.html?\>