Java正则表达式简介及实例
有時候會需要編寫代碼來驗證用戶輸入,比如驗證輸入是否是一個數字,是否是一個全部小寫的字符串,或者社會安全號,完成這個任務一個簡單高效的方法就是用正則表達式!
-
介紹
正則表達式(regular expression,簡寫為regex)是一個字符串,用來描述匹配一個字符串集合的模式。
java.util.regex 包實現正則表達式主要包括以下三個類:
- Pattern 類:
pattern 對象是一個正則表達式的編譯表示。Pattern 類沒有公共構造方法。要創建一個 Pattern 對象,你必須首先調用其公共靜態編譯方法,它返回一個 Pattern 對象。該方法接受一個正則表達式作為它的第一個參數。
- Matcher 類:
Matcher 對象是對輸入字符串進行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構造方法。你需要調用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象。
- PatternSyntaxException:
PatternSyntaxException 是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤。
-
匹配字符串
先從String的matches方法開始,matches方法很類似equals方法。但它不僅可以匹配固定字符串,還可以匹配一個模式的字符串集,例如,以下語句結果均為true。
“Java is fun”.matches("Java.*")
“Java is cool”.matches("Java.*")
“Java is powful”.matches("Java.*")
前面語句中的“Java.*”是一個正則表達式,它描述了一個字符串模式,以Java開始,后面跟0或者多個字符串。這里,字符串.*匹配任何0或多個字符。
-
正則表達式語法
正則表達式由字面值字符和特殊符號組成。
注:反斜杠是一個特殊的字符,在字符串中開始轉義序列。因此Java中需要使用\\來表示\。在其他的語言中(如 Perl),一個反斜杠?\?就足以具有轉義的作用,而在 Java 中正則表達式中則需要有兩個反斜杠才能被解析為其他語言中的轉義作用。也可以簡單的理解在 Java 的正則表達式中,兩個?\\?代表其他語言中的一個?\,這也就是為什么表示一位數字的正則表達式是?\\d,而表示一個普通的反斜杠是?\\。如下:
System.out.print("\\"); // 輸出為 \ System.out.print("\\\\"); // 輸出為 \\? ? ? ?空白字符是' '、'\t'、'\n\、'\r',或者'\f'。因此,\s和[\t\n\r\f]等同,\S和[^\t\n\r\f]等同。
以下為常用的正則表達式:
注:單詞字符是任何的字母,數字或者下劃線字符。因此\w等同于[a-z[A-Z][0-9]_]或者簡化為[a-Za-z0-9_]。\w等同于[^a-Za-z0-9].
? ? ? ?上表中后面六個條目*、+、?、{n}、{n,}以及{n,m}稱為兩次符(quantifier),用于確定量次符前面的模式會重復多少次。例如:A*匹配0或者多個A,A+匹配1或者多個A,A?匹配0或者1個A。A{3}精確匹配AAA,A{3,}不能寫成逗號后面有一個空白符的A{3,6}。
? ? ? ?不要在重復量詞符中使用空白。例如,A{3,6}不能寫成逗號后面有一個空白符的A{3, 6}
? ? ? ?可以使用括號來講模式進行分組。例如,(ab){3}匹配ababab,但是ab{3}匹配abbb。
-
構建正則表達式示例
-
示例1
社會安全號的模式是xxx-xx-xxx,其中x是一位數字。社會安全號的正則表達式可以描述為
[\\d]{3}-[\\d]{2}-[\\d]{4}
例如
"111-22-3333".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}") return true
"11-22-3333".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}") return false
-
示例2
電話號碼的模式是(xxx)xxx-xxxx,這里x是一位數字,并且第一位數字不能為0.電話號碼的正則表達式可以描述為
\\([1-9][\\d]{2})[\\d]{3}-[\\d]{4}
注:括符(和)在正則表達式中是特殊字符,用于對模式分組。為了在正則表達式中表示字面值(或者),必須使用\\(和\\)。
例如
"(912)921-2728".matches("\\ ([1-9][\\d]{2}\\)[\\d]{3}-[\\d]{4}")? return true.
"912-2728".matches("\\ ([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{3}-[\\d]{4}")? return false.
-
示例3
假定姓由最多25個字母組成,并且第一個字母為大寫形式。則姓的模式可以描述為[A-Z][a-zA-Z]{1,24}
注:不能隨便放空白符到正則表達式中。如[A-Z][a-zA-Z]{1, 24}將報錯。例如:
"Smith".matches("[A-Z][a-zA-Z]{1,24}? return true.
"Jones123".matches("[A-Z][a-zA-Z]{1,24}? return false.
-
示例4
Java標識符有如下要求
- 標識符必須以字母、下劃線(_),或者美元符號($)開始。不能以數字開頭。
- 標識符是一個由字母、數字、下劃線(_)和美元符號組成的字符序列。
標識符的模式可以描述為
[a-zA-Z_$][\\w$]*
-
示例5
什么字符串匹配正則表達式"Welcome to (Java|HTML)"?答案是Welcome to Java或者Welcome to HTML。
什么字符串匹配正則表達式".*"?答案是任何字符串。
-
替換和拆分字符串
如果字符串匹配正則表達式,String類的matches方法返回true。String類也包含repalceAll、replaceFirst和split方法,用于替換和拆分字符串,如下圖。
?replaceAll方法替換所有匹配的子字符串,replaceFirst方法替換第一個匹配的子字符串。例如,下面代碼
System.out.println("Java Java Java".replaceAll("v\\w","wi"));
顯示
Jawi Jawi Jawi
下面代碼
System.out.println("Java Java Java".replaceFirst("v\\w","wi"));
顯示
Jawi Java?Java
有兩個重載split方法。split(regex)方法使用匹配的分隔符將一個字符串拆分成為子字符串。例如,以下語句
String[] tokens="Java1HTML2perl".split("\\d");
將字符串拆分為Java、HTML以及Perl并且保存在tokens[0],tokens[1]以及tokens[2]中。
在split(regex,limit)方法中,limit參數確定模式匹配多少次。如果limit<=0,split(regex,limit)等同與split(regex)。如果limit>=0,模式最多匹配limit-1次。如以下示例:
"Java1HTML2perl".split("\\d",0);拆分為Java,HTML,Perl
"Java1HTML2perl".split("\\d",1);拆分為JavaHTMLPerl
"Java1HTML2perl".split("\\d",2);拆分為Java,HTMLPerl
"Java1HTML2perl".split("\\d",3);拆分為Java,HTML,Perl
"Java1HTML2perl".split("\\d",4);拆分為Java,HTML,Perl
"Java1HTML2perl".split("\\d",5);拆分為Java,HTML,Perl
注:默認情況下,所有的量詞字符都是”貪婪“的.這意味著它們會盡可能匹配最多次。比如,下面語句顯示JRvaa。因為第一個匹配成功的是aaa。
System.out.println("Jaaavaa".replaceFirst("a+","R"));
可以通過在后面添加問號(?)來改變量詞符的默認行為。量詞符變為”不情愿“或者”惰性“的,這意味著它將匹配盡可能少的次數。例如,下面的語句顯示JRaavaa,因為第一個匹配成功的是a。
System.out.println("Jaaavaa".replaceFirst("a+?","R"));
以上總結參考于
Java語言程序設計與數據結構 ?基礎篇 ?Comprehensive version_(美)梁勇(Y. Daniel Liang)
感興趣的小伙伴可以買來深入學習更多關于Java歐!
總結
以上是生活随笔為你收集整理的Java正则表达式简介及实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java环境变量怎么设置
- 下一篇: 拆机清灰重装系统数据恢复——心得汇总