1. 程式人生 > >正則表示式在Java中的使用

正則表示式在Java中的使用

這裡不打算說明正則表示式的具體細節,只講Java中使用正則表示式的一些基礎知識。

一個簡單的例子,使用正則表示式來匹配電話號碼,電話號碼包括了三到四位的區號;可有可無的連線符;6位到八位的電話號碼。正則表示式如下:

\d{3,4}-?\d{6,9}

這裡僅僅是舉個例子,實際使用中,考慮到電話號碼的合法性,區號還需要改進。簡單而言,像下面這樣就能使用這個正則表示式對字串進行驗證了:

boolean match = Pattern.matches("\\d{3,4}-?\\d{6,9}", "010-23232222");
match就是我們需要的驗證結果。

也可以轉換成Matcher物件再呼叫Matcher的matches方法:

Pattern pattern = Pattern.compile("\\d{3,4}-?\\d{6,9}");
//boolean match = Pattern.matches("\\d{3,4}-?\\d{6,9}", "010-23232222");
Matcher matcher = pattern.matcher("010-23232222");
System.out.println(matcher.matches());

這裡,僅僅是驗證一個字串是否符合正則表示式,這是最簡單的應用。如果想要在在一個字串中進行匹配查詢,就需要使用到Matcher物件了:

Pattern pattern = Pattern.compile("\\d{3,4}-?\\d{6,9}");
Matcher matcher = pattern.matcher("聯絡電話:010-23232222,地址:北京市朝陽區...");
while(matcher.find()){
	System.out.println(matcher.group());
}
這樣,就能從字串中摘取出符合正則表示式的內容了。

匹配模式

有的時候,需要進行忽略大小寫的匹配:

String moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
String input = "-3.33c";
boolean match = Pattern.compile(moneyRegex,Pattern.CASE_INSENSITIVE).matcher(input).matches();
該例子實現匹配攝氏溫度和華氏溫度,對於以C、c、F和f結尾的溫度值都能匹配。

這是依賴於API來忽略大小寫,正則表示式內部也支援忽略大小寫:

String moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*(?i)[CF]";
String input = "-3.33f";
boolean match = Pattern.compile(moneyRegex).matcher(input).matches();

Java還提供了很多類似於CASE_INSENSITIVE的模式標記,多個模式標記可以使用“|”符號連線。

Pattern.CANON_EQ:啟用正則等價。

Pattern.COMMENTS:啟用註釋,開啟之後,正則表示式中的空格以及#號行將被忽略:

String comments = "    (\\d)+#this is comments.";
String input = "1234";
boolean match = Pattern.compile(comments,Pattern.COMMENTS).matcher(input).matches();//true
boolean match2 = Pattern.compile(comments).matcher(input).matches();//false
可以看到,#號到行尾的註釋部分和前面的空白字元都被忽略了。正則表示式內建的啟用註釋為(?x):
String comments = "(?x)    (\\d)+#this is comments.";
String input = "1234";
boolean match = Pattern.compile(comments,Pattern.COMMENTS).matcher(input).matches();//true
boolean match2 = Pattern.compile(comments).matcher(input).matches();//true
Pattern.DOTALL:啟用dotall模式,一般情況下,點號(.)匹配任意字元,但不匹配換行符,啟用這個模式之後,點號還能匹配換行符:
String dotall = "<xml>(.)*</xml>";
String dotallInput = "<xml>\r\n</xml>";
boolean match = Pattern.compile(dotall,Pattern.DOTALL).matcher(dotallInput).matches();//true
boolean match2 = Pattern.compile(dotall).matcher(dotallInput).matches();//false
使用內建方式:
String dotall = "(?s)<xml>(.)*</xml>";
String dotallInput = "<xml>\r\n</xml>";
boolean match = Pattern.compile(dotall,Pattern.DOTALL).matcher(dotallInput).matches();//true
boolean match2 = Pattern.compile(dotall).matcher(dotallInput).matches();//true

Pattern.LITERAL:平白字元模式,啟用這個模式之後,所有元字元、轉義字元都被看成普通的字元,不再具有其他意義:
System.out.println(Pattern.compile("\\d",Pattern.LITERAL).matcher("\\d").matches());//true
System.out.println(Pattern.compile("\\d",Pattern.LITERAL).matcher("2").matches());//false
		
System.out.println(Pattern.compile("(\\d)+",Pattern.LITERAL).matcher("1234").matches());//false
System.out.println(Pattern.compile("(\\d)+").matcher("1234").matches());//true
		
System.out.println(Pattern.compile("(\\d){2,3}",Pattern.LITERAL).matcher("(\\d){2,3}").matches());//true
		
Pattern.MULTILINE:多行模式:預設情況下,輸入的字串被看作是一行,即便是這一行中包好了換行符也被看作一行。當匹配“^”到“$”之間的內容的時候,整個輸入被看成一個一行。啟用多行模式之後,包含換行符的輸入將被自動轉換成多行,然後進行匹配:
String multiline = "^(\\d)+$";
String multilineInput = "1234\r99\rabc\r128";
		
Pattern p = Pattern.compile(multiline, Pattern.MULTILINE);
Matcher m = p.matcher(multilineInput);
while(m.find()){
	System.out.println(m.group());
}
例子中,將字串中的數字摘取出來,如果不啟用多行模式,將什麼也匹配不到。可以用(?m)在正則表示式內部啟用多行模式。

Pattern.UNIX_LINE:unix行模式,大多多數系統的行都是以“\n”結尾的,但是少數系統,比如Windows,卻是以“\r\n”組合來結尾的,啟用這個模式之後,將會只以“\n”作為行結束符,這會影響到^、$和點號(點號匹配換行符)。

Pattern方法

split方法

Pattern提供了一個split方法,可以按照給定的正則表示式將字串進行分割:

String splitRegex = "\\([A-D]\\)";
String splitInput = "(A)非常滿意  (B)滿意   (C)一般  (D)不滿意";
Pattern splitPattern  = Pattern.compile(splitRegex);
for(String str : splitPattern.split(splitInput)){
	System.out.println(str);
}
執行結果:
非常滿意  
滿意   
一般  
不滿意

quote方法

有點兒類似於Pattern.LITERAL的功能,方法可以為給定的字串建立LITERAL模式的正則表示式:

String quote = Pattern.quote("\\d");
System.out.println(Pattern.matches(quote, "\\d"));//true
System.out.println(Pattern.matches("\\d", "\\d"));//false

String類也提供了一些支援正則表示式的方法:

matches方法:

String str = "1234";
System.out.println(str.matches("(\\d)+"));//true

字串的split方法和replace方法也支援正則表示式:
String str2 = "a.1分       b.2分      c.3分       d.4分";
for(String score : str2.split("[a-d]+\\.")){
	System.out.println(score);
}

String str2 = "a.1分       b.2分      c.3分       d.4分";
str2 = str2.replaceAll("([a-d])+\\.", "[$1]");
System.out.println(str2);
執行結果:
[a]1分       [b]2分      [c]3分       [d]4分
這裡用到了反向引用,$1表示的就是匹配出來的[a-d]。

Matcher方法:

lookingAt方法:

String str3 = "foooooooooooo";
Matcher matcher3 = Pattern.compile("foo").matcher(str3);
System.out.println(matcher3.lookingAt());//true
System.out.println(matcher3.matches());//false
字串是否包含所指定的正則表示式,不用通過find方法挨個找,lookingAt可以一次性實現這個功能。

字串替換:

double d = 1.0 / 3;
String numberRegex = "(\\d+\\.\\d{2,3})\\d*";
Matcher matcher4 = Pattern.compile(numberRegex).matcher("one divide by three eq : " + d +"");
String result = matcher4.replaceFirst("$1");
System.out.println(result);// OUPUT: one divide by three eq : 0.333

以上程式碼實現講字串保留小數的功能(只有兩位小數位則不動)。

相關推薦

表示式——JAVA與JS的使用

一、JAVA: <code class="hljs ruby has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizin

表示式 - - java.util.regex 包 (二)

java.util.regex 包主要包括以下三個類: Pattern 類: pattern 物件是一個正則表示式的編譯表示。Pattern 類沒有公共構造方法。要建立一個 Pattern 物件,你必須首先呼叫其公共靜態編譯方法,它返回一個 Pattern 物件。該方法接受一個正則表示式

表示式-Java例子

一、Java中使用Pattern類進行正則匹配 @org.junit.Test public void test1() { String regex = "^[\\s]*abc[\\s]";

Python表示式Refindall

findall中()裡面的內容是需要捕獲的內容,但是如果我們想捕獲整個正則表示式的結果則需要新增如下程式碼: #-*-coding:utf8-*- import re str1 = "[email protected]@[email protected]@asdfcom" a

表示式—HTML的匹配

從HTML中文字中提取Email地址和http URL,是在做爬蟲時候的經常用到的技術,雖然變成語言本身可以幫助我們找到他們,但是用正則表示式來匹配也是很有用和具有實際意義的方法。 一、匹配HTML Tag HTML不是有特別嚴格程式設計要求的,因此在匹配時

表示式-去除括號

var str = '這是一個字串[html]語句;[html]字串很常見'; console.log(str.replace(/\[|]/g,'')); ==》這是一個字串[html]語句;[html]字串很常見 ==> 這是一個字串html語句;html字串很常

Python表示式處理文中的匹配

由於中文使用2個位元組來表示一個字,在正則表示式中如果不進行轉換的話,編譯器是不能識別的,所以這裡簡要談一下正則表示式中遇到中文的問題。 關於python的re模組的基本用法,與各種正則表示式的基本形式,在之前的一篇文章中,進行過介紹,故此處不再贅述。 下面是一段對中文

python表示式re m.group和m.groups的解釋

先看程式碼 instance: 究其因: 正則表示式中的三組括號把匹配結果分成三組 m.group() == m.group(0) == 所有匹配的字元(即匹配正則表示式整體結果) group(1) 列出第一個括號匹配部分,group(2)

手機號碼、郵箱匹配表示式java實現練手

概念:正則表示式就是用某種模式去匹配一類字串的一個公式。它由一些普通字元和一些元字元(metacharacters)組成。普通字元包括大小寫的字母和數字,而元字元則具有特殊的含義。 正則表示式的基礎語法為: “^([]{})([]{})([]{})$”。

python3 表示式(更新

1、特殊符號(先解釋,後面會有例子) 表示 描述 re1|re2 或的關係 . 匹配任何字元(\n除外),要顯示的匹配.號,需要加\| ^ 匹配字串

ip表示式 java判斷ip地址

  符號 '\d'等價的正則表示式'[0-9]',匹配數字0-9;  {1,3}表示匹配三位以內的數字(包括三位數) /** * Ip地址判斷<br> * 符號 '\d'等價的

表示式(模式器,匹配器)及java的日期表示

正則表示式 正則表示式:用於匹配某些特定字串的一個規則。 沒有學會使用正則表示式的時候,我們遇到過這麼一個需求-----校驗使用者名稱是否合法? 具體要求如下: 1)使用者名稱長度必須在6到15之間 2)必須是字母數字組合 非正則具體實現如下 public clas

Java表示式過濾、替換,將一段文字的英語單詞分別提取出,並統計詞頻,按詞頻排序。

最近在學習自然語言處理,在建立基礎標籤庫時,遇到一個需要提取語料中的英文單詞的工作,做好了現在來和大家分享下。 實現效果:讀取檔案內容,把其中的英文單詞提取出,並統計詞頻。提取時,原本不是連在一起的單詞可以分開獨立提取,例如:我的PPT和WORD,可以提取出PPT,WORD兩個單詞。 基本思

java表示式去除html所有的標籤和特殊HTML字元

關於java正則表示式去除html中所有的標籤和特殊HTML字元,結合我所做的專案總結的經驗: 總共分為三種:第一種適用於適用短的文章,將文章用正則表示式的方式拼接到程式碼中,有些繁瑣,其實不太實用。第二種就是直接將文件引入,進行更改,但是有一個小缺點,就是文件中的格式可能是utf-8格式的

表示式--Java的一種特殊情形

定義 正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字 正則表示式在Java中不同與其他語言的情況 : 特殊情況 在其他

java使用表示式從一長串字元獲取一段特徵字串

只能說String工具類太強大,導致一直以來,幾乎沒怎麼用到過正則表示式,現在突然要用到,參考正則表示式語法,摸索一上午才搞出來。記錄分享一下,以免忘記 從一長串字元中,截取出邀請碼,我想很多人都遇到過。 String s = "邀請您加入隨心購,自動搜尋淘寶天貓優惠券!先領券,再購

Java表示式以及例項

1、 字元  a) x字元x。如‘a’代表字元a  b) \ \反斜線字元用\\代表一個\  c) \n換行符(‘\u000A’)  d) \r回車符(‘\u000D’) 2、 字元類  a) [abc] a、b或c(簡單類)  b) [^abc]除了a、b、c的任何字元  c) [a-zA

java表示式的瞭解與實踐記錄

Pattern pattern = Pattern.compile("^\\S+/q/"); Matcher matcher = pattern.matcher(resultString); String qrcode=""; while(matcher.find()){ String path

Java表示式相關類Pattern和Matcher的使用

在Java中,java.util.regex包定義了正則表示式使用到的相關類,其中最主要的兩個類為:Pattern、Matcher:   Pattern 編譯正則表示式後建立一個匹配模式;   Matcher 使用Pattern例項提供的正則表示式對目標字串進行匹

Java 實際應用常用的表示式

1.正則表示式 jdk1.4 開始提供了正則表示式的支援; java.util.regex Pattern類:此類物件如果想要獲得必須使用compile(), 此方法的功能式編譯正則 Matcher類:通過Patern類取得;2.正則標記  1.所有的正則可以使用的標記都在java.uti