正規表達式的比對規則是從左到右按規則比對。我們首先來看如何使用正規表達式來做精确比對。
對于正規表達式
abc
來說,它隻能精确地比對字元串
"abc"
,不能比對
"ab"
,
"Abc"
,
"abcd"
等其他任何字元串。
如果正規表達式有特殊字元,那就需要用
\
轉義。例如,正規表達式
a\&c
,其中
\&
是用來比對特殊字元
&
的,它能精确比對字元串
"a&c"
,但不能比對
"ac"
、
"a-c"
、
"a&&c"
等。
要注意正規表達式在Java代碼中也是一個字元串,是以,對于正規表達式
a\&c
來說,對應的Java字元串是
"a\\&c"
,因為
\
也是Java字元串的轉義字元,兩個
\\
實際上表示的是一個
\
:
如果想比對非ASCII字元,例如中文,那就用
\u####
的十六進制表示,例如:
a\u548cc
比對字元串
"a和c"
,中文字元
和
的Unicode編碼是
548c
。
比對任意字元
精确比對實際上用處不大,因為我們直接用
String.equals()
就可以做到。大多數情況下,我們想要的比對規則更多的是模糊比對。我們可以用
.
比對一個任意字元。
例如,正規表達式
a.c
中間的
.
可以比對一個任意字元,例如,下面的字元串都可以被比對:
-
,因為"abc"
可以比對字元.
;b
-
,因為"a&c"
可以比對字元.
;&
-
,因為"acc"
可以比對字元.
。c
但它不能比對
"ac"
、
"a&&c"
,因為
.
比對一個字元且僅限一個字元。
比對數字
用
.
可以比對任意字元,這個口子開得有點大。如果我們隻想比對
0
~
9
這樣的數字,可以用
\d
比對。例如,正規表達式
00\d
可以比對:
-
,因為"007"
可以比對字元\d
;7
-
,因為"008"
可以比對字元\d
。8
它不能比對
"00A"
,
"0077"
,因為
\d
僅限單個數字字元。
比對常用字元
用
\w
可以比對一個字母、數字或下劃線,w的意思是word。例如,
java\w
可以比對:
-
,因為"javac"
可以比對英文字元\w
;c
-
,因為"java9"
可以比對數字字元\w
;。9
-
,因為"java_"
可以比對下劃線\w
。_
它不能比對
"java#"
,
"java "
,因為
\w
不能比對
#
、空格等字元。
比對空格字元
用
\s
可以比對一個空格字元,注意空格字元不但包括空格,還包括tab字元(在Java中用
\t
表示)。例如,
a\sc
可以比對:
-
,因為"a c"
可以比對空格字元;\s
-
,因為"a c"
可以比對tab字元\s
。\t
它不能比對
"ac"
,
"abc"
等。
比對非數字
用
\d
可以比對一個數字,而
\D
則比對一個非數字。例如,
00\D
可以比對:
-
,因為"00A"
可以比對非數字字元\D
;A
-
,因為"00#"
可以比對非數字字元\D
。#
00\d
可以比對的字元串
"007"
,
"008"
等,
00\D
是不能比對的。
類似的,
\W
可以比對
\w
不能比對的字元,
\S
可以比對
\s
不能比對的字元,這幾個正好是反着來的。
// regex
Run
重複比對
我們用
\d
可以比對一個數字,例如,
A\d
可以比對
"A0"
,
"A1"
,如果要比對多個數字,比如
"A380"
,怎麼辦?
修飾符
*
可以比對任意個字元,包括0個字元。我們用
A\d*
可以比對:
-
:因為A
可以比對0個數字;\d*
-
:因為A0
可以比對1個數字\d*
;0
-
:因為A380
可以比對多個數字\d*
。380
修飾符
+
可以比對至少一個字元。我們用
A\d+
可以比對:
-
:因為A0
可以比對1個數字\d+
;0
-
:因為A380
可以比對多個數字\d+
。380
-
:因為A
可以比對0個數字;\d?
-
:因為A0
可以比對1個數字\d?
。0