Java 正則表達式
字符含義
字符 |
說明 |
\ |
將下一字符標記爲特殊字符、文本、反向引用或八進制轉義符。例如,“n”匹配字符“n”。“\n”匹配換行符。序列“\\”匹配“\”,“\(”匹配“(”。 |
^ |
匹配輸入字符串開始的位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與“\n”或“\r”之後的位置匹配。 |
$ |
匹配輸入字符串結尾的位置。如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與“\n”或“\r”之前的位置匹配 |
* |
零次或多次匹配前面的字符或子表達式。例如,zo* 匹配“z”和“zoo”。* 等效於 {0,}。 |
+ |
一次或多次匹配前面的字符或子表達式。例如,“zo+”與“zo”和“zoo”匹配,但與“z”不匹配。+ 等效於 {1,}。 |
? |
零次或一次匹配前面的字符或子表達式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效於 {0,1}。 |
{n} |
n 是非負整數。正好匹配 n 次。例如,“o{2}”與“Bob”中的“o”不匹配,但與“food”中的兩個“o”匹配。 |
{n,} |
至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效於“o+”。“o{0,}”等效於“o*”。 |
{n,m} |
匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的頭三個 o。'o{0,1}' 等效於 'o?'。注意:您不能將空格插入逗號和數字之間。 |
? |
當此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之後時,匹配模式是“非貪婪的”。“非貪婪的”模式匹配搜索到的、儘可能短的字符串,而默認的“貪心的”模式匹配搜索到的、儘可能長的字符串。例如,在字符串“oooo”中,“o+?”只匹配單個“o”,而“o+”匹配所有“o”。 |
. |
匹配除“\n”之外的任何單個字符。若要匹配包括“\n”在內的任意字符,請使用諸如“[\s\S]”之類的模式。 |
x|y |
匹配 x 或 y。例如,'z|food' 匹配“z”或“food”。'(z|f)ood' 匹配“zood”或“food”。 |
[xyz] |
字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。 |
[^xyz] |
反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。 |
[a-z] |
字符範圍。匹配指定範圍內的任何字符。例如,“[a-z]”匹配“a”到“z”範圍內的任何小寫字母。 |
\b |
匹配一個字邊界,即字與空格間的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。 |
\B |
非字邊界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。 |
\d |
數字字符匹配。等效於 [0-9] |
\D |
非數字字符匹配。等效於 [^0-9]。 |
\n |
換行符匹配。等效於 \x0a 和 \cJ。 |
\r |
匹配一個回車符。等效於 \x0d 和 \cM。 |
\s |
匹配任何空白字符,包括空格、製表符、換頁符等。與 [ \f\n\r\t\v] 等效。 |
\S |
匹配任何非空白字符。與 [^ \f\n\r\t\v] 等效。 |
\w |
匹配任何字類字符,包括下劃線。與“[A-Za-z0-9_]”等效。 |
\W |
與任何非單詞字符匹配。與“[^A-Za-z0-9_]”等效。 |
常用正則表達式:
2整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$
3 只能輸入數字:"^[0-9]*$"。
4 只能輸入n位的數字:"^\d{n}$"。
5 只能輸入至少n位的數字:"^\d{n,}$"。
6 只能輸入m~n位的數字:。"^\d{m,n}$"
7 只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。
8 只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。
9 只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"。
10 只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
11 只能輸入非零的負整數:"^\-[1-9][]0-9"*$。
12 只能輸入長度爲3的字符:"^.{3}$"。
13 只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。
14 只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
15 只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
16 只能輸入由數字和26個英文字母組成的字符串:"^[A-Za-z0-9]+$"。
17 只能輸入由數字、26個英文字母或者下劃線組成的字符串:"^\w+$"。
18 驗證用戶密碼:"^[a-zA-Z]\w{5,17}$"正確格式爲:以字母開頭,長度在6~18之間,只能包含字符、數字和下劃線。
19 驗證是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
20 只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"
21 驗證Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
22 驗證InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
23 驗證電話號碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正確格式爲:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
24 驗證身份證號(15位或18位數字):"^\d{15}|\d{18}$"。
25 驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式爲:"01"~"09"和"1"~"12"。
26 驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式爲;"01"~"09"和"1"~"31"。
27 匹配中文字符的正則表達式: [\u4e00-\u9fa5]
28 匹配雙字節字符(包括漢字在內):[^\x00-\xff]
29 應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
30 String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;}
31 匹配空行的正則表達式:\n[\s| ]*\r
32 匹配html標籤的正則表達式:<(.*)>(.*)<\/(.*)>|<(.*)\/>
33 匹配首尾空格的正則表達式:(^\s*)|(\s*$)
Pattern類和Matcher類應用
java正則表達式通過java.util.regex包下的Pattern類與Matcher類實現,單獨用Pattern只能使用pattern.matches(Stringregex,CharSequence input)一種最基礎最簡單的匹配。
Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(Stringregex)簡單工廠方法創建一個正則表達式,
Java代碼示例:
Patternp=Pattern.compile("\\w+");
p.pattern();//返回 \w+
pattern() 返回正則表達式的字符串形式,其實就是返回Pattern.complile(String regex)的regex參數 。
1.pattern.split(CharSequence input)
Pattern有一個split(CharSequence input)方法(不是靜態方法),用於分隔字符串,並返回一個String[],我猜String.split(String regex)就是通過Pattern.split(CharSequenceinput)來實現的。
Java代碼示例:
Pattern p=Pattern.compile("\\,");
String[] str=p.split("我的QQ是:456456,我的電話是:0532214,我的郵箱是:[email protected]");
2.Pattern.matcher(String regex,CharSequence input)是一個靜態方法,用於快速匹配字符串,該方法適合用於只匹配一次,且匹配全部字符串。
Java代碼示例:
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這裏aa不能匹配到
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這裏bb不能匹配到
3.Pattern.matcher(CharSequenceinput)
說了這麼多,終於輪到Matcher類登場了,Pattern.matcher(CharSequence input)返回一個Matcher對象。
Matcher類的構造方法也是私有的,不能隨意創建,只能通過Pattern.matcher(CharSequence input)方法得到該類的實例。
Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作。Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持。
Java代碼示例:
Patternp=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.pattern();//返回p (主要是裏面的表達式)也就是返回該Matcher對象是由哪個Pattern對象的創建的
4.Matcher.matches()/ Matcher.lookingAt()/Matcher.find()
Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false 。
matches()對整個字符串進行匹配,只有整個字符串都匹配了才返回true
Java代碼示例:
Patternp=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因爲bb不能被\d+匹配,導致整個字符串匹配未成功。
Matcher m2=p.matcher("2223");
m2.matches();//返回true,因爲\d+匹配到了整個字符串
我們現在回頭看一下Pattern.matcher(Stringregex,CharSequence input),它與下面這段代碼等價
Pattern.compile(regex).matcher(input).matches()
lookingAt()對前面的字符串進行匹配,只有匹配到的字符串在最前面才返回true
Java代碼示例:
Patternp=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.lookingAt();//返回true,因爲\d+匹配到了前面的22
Matcher m2=p.matcher("aa2223");
m2.lookingAt();//返回false,因爲\d+不能匹配前面的aa
find()對字符串進行匹配,匹配到的字符串可以在任何位置.
Java代碼示例:
Patternp=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.find();//返回true
Matcher m2=p.matcher("aa2223");
m2.find();//返回true
Matcherm3=p.matcher("aa2223bb");
m3.find();//返回true
Matcher m4=p.matcher("aabb");
m4.find();//返回false
5.Mathcer.start()/ Matcher.end()/Matcher.group()
當使用matches(),lookingAt(),find()執行匹配操作後,就可以利用以上三個方法得到更詳細的信息.
start()返回匹配到的子字符串在字符串中的索引位置.
end()返回匹配到的子字符串的最後一個字符在字符串中的索引位置.
group()返回匹配到的子字符串
Java代碼示例:
Pattern p=Pattern.compile("\\d+");
Matcherm=p.matcher("aaa2223bb");
m.find();//匹配2223 不能少這一個不然編譯錯誤,IllegalStateException
m.start();//返回3
m.end();//返回7,返回的是2223後的索引號
m.group();//返回2223
Mathcer m2=p.matcher("2223bb");
m2.lookingAt(); //匹配2223 不能少,下面的會報運行時錯誤
m2.start(); //返回0,由於lookingAt()只能匹配前面的字符串,所以當使用lookingAt()匹配時,start()方法總是返回0
m2.end(); //返回4
m2.group(); //返回2223
Matcher m3=p.matcher("2223"); //如果Matcherm3=p.matcher("2223bb"); 那麼下面的方法出錯,因爲不匹配返回false
m3.matches(); //匹配整個字符串
m3.start(); //返回0
m3.end(); //返回3,原因相信大家也清楚了,因爲matches()需要匹配所有字符串
m3.group(); //返回2223
Matcher方法如下: MatcherappendReplacement(StringBuffer sb, String replacement)
將當前匹配子串替換爲指定字符串,並且將替換後的子串以及其之前到上次匹配子串之後的字符串段添加到一個StringBuffer對象裏。
StringBuffer appendTail(StringBuffer sb)
將最後一次匹配工作後剩餘的字符串添加到一個StringBuffer對象裏。
★matches()/lookingAt ()/find():
一個Matcher對象是由一個Pattern對象調用其matcher()方法而生成的,一旦該Matcher對象生成,它就可以進行三種不同的匹配查找操作:
matches()方法嘗試對整個目標字符展開匹配檢測,也就是隻有整個目標字符串完全匹配時才返回真值。
lookingAt ()方法將檢測目標字符串是否以匹配的子串起始。
find()方法嘗試在目標字符串裏查找下一個匹配子串。
以上三個方法都將返回一個布爾值來表明成功與否。
★replaceAll ()/appendReplacement()/appendTail():
Matcher類同時提供了四個將匹配子串替換成指定字符串的方法:
replaceAll()
replaceFirst()
appendReplacement()
appendTail()