Regex是一個非常強大的工具,它對於字串的處理提供非常強大的功能。今天這篇文章只是簡要的簡紹下Regex的文法,以及如何在java中應用它。
那麼什麼是Regex呢?在百度百科中是這麼描述的:在電腦科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串。在很多文字編輯器或其他工具裡,Regex通常被用來檢索和/或替換那些符合某個模式的常值內容。許多程式設計語言都支援利用Regex進行字串操作。例如,在Perl中就內建了一個功能強大的Regex引擎。Regex這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。Regex通常縮寫成“regex”,單數有regexp、regex,複數有regexps、regexes、regexen。
為了認識什麼是Regex,先舉一個簡單的例子:
"aa".matches(".*");
查閱API文檔,我們找到了這個方法:public boolean matches(String regularExpression);其中傳入的參數就是Regex。
一,簡單是認識 ".", "\d", "\D", "\s", "\S", "\w", "\W"
上面這些在Regex中被稱為:Prefined character classes(已定義好的字元類)。
"."Any character (may or may not match line
terminators)
用於匹配任意一個字元。
"\d"A digit:[0-9]
用於匹配數字,它和[0-9]是等價的
"\D"A non-digit:[^0-9]
用於匹配非數字,和[^0-9]是等價的
"\s"A whitespace character:[ \t\n\x0B\f\r]
用於匹配空白字元,其中包括:空格,\t,\n,\x0B,\f,\r,它的用法和:[ \t\n\x0B\f\r]等價
“\S"A non-whitespace character:[^\s]
用於匹配非空白字元。
"\w"A word character:[a-zA-Z_0-9]
用於匹配word字元,包括a-z的小寫字元,A-Z的大寫字元,底線和數字。
"\W"A non-word character:[^\w]
用於匹配非word字元。
二,簡答認識Regex中的”集合“,及"[","]"的使用。
[abc]a,b or c.
可以用數學中集合中的概念”或“來描述。及可以描述成:a或b或c。
[^abc]Any character except a,b,c
這個類似於集合中求補集的概念,也可以理解成”非“。及除了a,b,c外的任一字元。
[a-zA-Z]和[a-z[A-Z]]
兩者都是“a-z或A-Z”的意思。前者是平行關係,或者是並集關係。
[a-z&&[def]]intersection
就是取交集的意思。
三,邊界匹配,"^", "$", "\b", "\B" , "\A", "\G", "\Z", "\z"
"^"The beginning of a line
匹配字串的開頭。如,"abc".matches("^a.*");返回true。
"$"The end of a line
匹配字串的結尾。如,"abc".matches("abc$");返回true。
"\b"A word boundary
匹配單詞邊界。如,"hello world".matches("hello\\b\\swordl");返回true。
"\B"A non-word boundary
匹配非單詞邊界。
"\A"The beginning of the input
匹配輸入的開頭。
"\G"The end of the previos match
"\Z"The
end of the input but for the final terminator, if any
"\z"The end of the input.
三,限定次數。又分三種:Greedy quantifiers,Reluctant quantifiers和Possessive quantifiers
1,Greedy quantifiers。
其實三種模式的用法基本上相同,只是在匹配的策略上會有所不同,所以結果有時會有不同。
X?X,once or not at all
X出現一次或一次也沒有出現。
X*X,zero or more times
X沒有出現或出現任意次。
X+X,once or more times
X出現一次或一次以上
X{n}X,exactly n times
X剛好出現n次
X{n,}X,at least n times
X至少出現n次
X{n,m}X,atleast n times bu no more than m times
X出現次數在n和m範圍之間
2,Reluctant quantifiers
X??,X*?,X+?,X{n}?,X{n,?}?,X{n,m}?各自的解釋對應於Greedy quantifiers 中的解釋。
3,Possessve quantifiers
X?+,X*+,X++,X{n}+,X{n,?}+,X{n,m}+各自的解釋對應於Greedy
quantifiers 中的解釋。
那麼他們三個有什麼不同之處呢?先看一下下面的例子:
1,Greedy quantifiers:
Pattern p = Pattern.compile("\\w+\\d{2}");Matcher m = p.matcher("aa22bb22");if(m.find()){System.out.println(m.group());}
此時輸出結果為:aa22bb22;
2,Reluctant quantifiers:
Pattern p = Pattern.compile("\\w+?\\d{2}");Matcher m = p.matcher("aa22bb22");if(m.find()){System.out.println(m.group());}
此時輸出結果為:aa22;
3,Possessive quantifiers;
Pattern p = Pattern.compile("\\w++\\d{2}");
Matcher m = p.matcher("aa22bb22");if(m.find()){System.out.println(m.group());}
此時輸出結果為空白,就是說沒有得到匹配的結果。
那麼從上面個的例子我們容易看出它們直接的區別還是很大的,從名字上來看,Greedy:貪婪的。意思就是想在在匹配的結果中找打儘可能長的字串。Reluctant:不情願的。意思就是從匹配的結果中找到儘可能短的字串。Possessive:佔有慾強的。就是一次匹配Regex中最長的長度來匹配,如果次長度匹配不了就不再進行匹配。
四,Pattern 和 Matcher
這兩個類是java中用於正則表示的最基礎的兩個類,上面的例子中也用到了這兩個類,其中提供了許多實用的方法。這就需要我們在實用的時候去查閱API文旦了。
當然,限於篇幅和本文的初衷,唯寫了其中最基礎的一些用法,在Pattern的文檔中還有其他常用的一些匹配,需要我們在實用的時候去查閱文檔了。
最後在提醒一點,在java中凡是要用到斜杠"\"的地方一定要用雙斜杠"\\"來代替,因為單斜杠會和其他字元組合成為逸出字元。
"