什么是正則表達式?
概念:維基百科上是這樣定義的:
正則表達式(英語: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”,那既然“\\”有特殊意義,我們就不能拿它來匹配它本身了,于是就只能用“\\\\”來匹配“\\”這個反斜杠了。
下面表格是一些特殊符號,上面字符只能匹配自己,應該是模糊匹配吧,它們能匹配不只一個字符,在這里要拋出一個關鍵詞-字符類。
什么是字符類?
字符類有一個共同特點-用來匹配且只能匹配單個字符。它們不像數量詞是為了說明或是限制字符的次數的,
它們就是為了匹配字符的,其中還有一些預定義字符類,它們是為了方便使用常用字符類而預定義的字符類。
功能 |
特殊符號 |
描述 |
|||||||||||||||
字符類(用于匹配單個字符) |
字符類 |
[] |
|
||||||||||||||
預定義字符類 |
. |
任何字符(與行結束符可能匹配也可能不匹配) |
|||||||||||||||
\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