什么是正则表达式?
概念:维基百科上是这样定义的:
正则表达式(英语:Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,在计算机科学中,
是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。正则表达式这个概念最初是由Unix中的工具软件
(例如sed和grep)普及开的。
上面定义可以简化为:正则表达式是持有某个句法规则的单个字符串。
这样对正则表达式的认识就明朗了很多。
1. 它是字符串
2. 它持有句法规则
那什么是句法规则?
说白了,句法规则就是特殊符号,表达匹配意义的符号。如果你知道这些特殊符号都能匹配什么字符,你就掌握了正则表达式!
我们先来看看一般字符是什么样子的:
x
|
字符 x
|
\\
|
反斜线字符
|
\0n
|
带有八进制值 0 的字符 n (0 <= n <= 7)
|
\0nn
|
带有八进制值 0 的字符 nn (0 <= n <= 7)
|
\0mnn
|
带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
|
\xhh
|
带有十六进制值 0x 的字符 hh
|
\uhhhh
|
带有十六进制值 0x 的字符 hhhh
|
\t
|
制表符 ('\u0009')
|
\n
|
新行(换行)符 ('\u000A')
|
\r
|
回车符 ('\u000D')
|
\f
|
换页符 ('\u000C')
|
\a
|
报警 (bell) 符 ('\u0007')
|
\e
|
转义符 ('\u001B')
|
\cx
|
对应于 x 的控制符
|
上面都是一般的字符,它们不要我们要研究的对象,它们没有特殊的匹配意义,它们只能匹配自己,例如:
正则表达式
|
匹配字符
|
t
|
t
|
\n
|
\n
|
\\\\
|
\\
|
也许你看出来了,怎么最后一个例子不是自己匹配自己啊?是“\\\\”匹配“\\”。
这是因为 “\\”在Java正则表达式中有特殊意义。在Java中(注意只是在Java中,在其它语言中并不是这样的)
“\\”表示我要插入一个正则表达式反 斜杠,紧跟其后的符号有特殊意义,要小心啊。比如:要匹配1-9的单数字,
我们要这样写“\\d”,那既然“\\”有特殊意义,我们就不能拿它来匹配它本身了,于是就只能用“\\\\”来匹配“\\”这个反斜杠了。
下面表格是一些特殊符号,上面字符只能匹配自己,应该是模糊匹配吧,它们能匹配不只一个字符,在这里要抛出一个关键词-字符类。
什么是字符类?
字符类有一个共同特点-用来匹配且只能匹配单个字符。它们不像数量词是为了说明或是限制字符的次数的,
它们就是为了匹配字符的,其中还有一些预定义字符类,它们是为了方便使用常用字符类而预定义的字符类。
功能
|
特殊符号
|
描述
|
字符类(用于匹配单个字符)
|
字符类
|
[]
|
[abc]
|
a、b 或 c(简单类)
|
[^abc]
|
任何字符,除了 a、b 或 c(否定)
|
[a-zA-Z]
|
a到 z 或 A 到 Z,两头的字母包括在内(范围)
|
[a-d[m-p]]
|
a到 d 或 m 到 p:[a-dm-p](并集)
|
[a-z&&[def]]
|
d、e 或 f(交集)
|
[a-z&&[^bc]]
|
a到 z,除了 b 和 c:[ad-z](差集)
|
[a-z&&[^m-p]]
|
a到 z,而非 m 到 p:[a-lq-z](差集)
|
|
预定义字符类
|
.
|
任何字符(与行结束符可能匹配也可能不匹配)
|
\d
|
数字:[0-9]
|
\D
|
非数字: [^0-9]
|
\s
|
空白字符:[ \t\n\x0B\f\r]
|
\S
|
非空白字符:[^\s]
|
\w
|
单词字符:[a-zA-Z_0-9]
|
\W
|
非单词字符:[^\w]
|
次数匹配(X表示单个字符或字符组)
|
Greedy 数量词
|
X?
|
|
X*
|
|
X+
|
|
X{n}
|
|
X{n,}
|
|
X{n,m}
|
|
Reluctant数量词
|
X??
|
|
X*?
|
|
X+?
|
|
X{n}?
|
|
X{n,}?
|
|
X{n,m}?
|
|
Possessiv数量词
|
X?+
|
|
X*+
|
|
X++
|
|
X{n}+
|
|
X{n,}+
|
|
X{n,m}+
|
|
边界匹配
|
^
|
行的开头
|
$
|
行的结尾
|
\b
|
单词边界
|
\B
|
非单词边界
|
\A
|
输入的开头
|
\G
|
上一个匹配的结尾
|
\Z
|
输入的结尾,仅用于最后的结束符(如果有的话)
|
\z
|
输入的结尾
|
上面是用来匹配字符或是对字符的限制,那如何把它些字符串起来,行成一个字符序列,要用到逻辑运算符:
XY
|
X后跟 Y
|
X|Y
|
X或 Y
|
(X)
|
X,作为捕获组
|
逻辑运算符中最后一项提到捕获组,那什么是捕获组?
有关组和捕获推荐一篇文章,很详细:
http://blog.csdn.net/lovingprince/archive/2008/08/06/2774819.aspx