[Java] 12.2. 正規表示式

正規表示式,用規則找出你要的文字。

 

image/svg+xml12.2. 正規表⽰式 – Regular Expression 星號( * ),讓電話號碼選擇性的包含特殊符號,如 () - 更多的正規表⽰式符號 class Main{ public static void main( String [] args){ String personInfo = " 姓名 : 王⼩明 ," + " 年齡 : 20," + " 姓別 : ," + " 電話 1: 037412312 ," + " 電話 2: 0925123456 ," + " 電話 3: 0987561000 " ; System.out.println( personInfo ); } } import java.util.regex.* ; class Main{ public static void main( String [] args){ String personInfo = " 姓名 : 王⼩明 ," + " 年齡 : 20," + " 姓別 : ," + " 電話 1: 037412312 ," + " 電話 2: 0925123456 ," + " 電話 3: 0987561000 " ; Pattern p = Pattern.compile ( " \\d{9,10} " ); Matcher m = p.matcher ( personInfo ); while ( m.find ()){ System.out.print( " " + m.start ()); System.out.println( ", 發現電話號碼 :" + m.group ()); } } } import java.util.regex.*;; class Main{ public static void main( String [] args){ String personInfo = " 姓名 : 王⼩明 ," + " 年齡 : 20," + " 姓別 : ," + " 電話 1: 037-412312 ," + " 電話 2: (0925)123456 ," + " 電話 3: 0987:561000 " ; Pattern p = Pattern.compile ( " \\d{9,10} " ); Matcher m = p.matcher(personInfo); while (m.find()){ System.out.print( " " + m.start()); System.out.println( ", 發現電話號碼 :" + m.group()); } } } import java.util.regex.*;; class Main{ public static void main( String [] args){ String personInfo = " 姓名 : 王⼩明 ," + " 年齡 : 20," + " 姓別 : ," + " 電話 1: 037-412312 ," + " 電話 2: (0925)123456 ," + " 電話 3: 0987:561000 " ; Pattern p = Pattern.compile( " \\( *\\d{3,4} \\)* :* -* \\d{6}" ); Matcher m = p.matcher(personInfo); while (m.find()){ System.out.print( " " + m.start()); System.out.println( ", 發現電話號碼 :" + m.group()); } } } 執⾏結果 037-412312 (0925)123456 0987:561000 下表為正規表⽰式( Regular Expression )中常⽤的中介字元,⽽中介字元即指虛擬的替代符號的意 思,⽤以表⽰更抽象的字意,如 \d 即可代表 0~9 的數值的意思。 下表為正規表⽰式中常⽤的量詞,⽤以描述特定字元或字串出現的次數: import java.util.regex.*;; class Main{ public static void main( String [] args){ String personInfo = " 姓名 : 王⼩明 ," + " 年齡 : 20," + " 姓別 : ," + " 電話 1: 037-412312 ," + " 電話 2: (0925)123456 ," + " 電話 3: 0987:561000 " ; Pattern p = Pattern.compile ( "[ (]* \\d+[)- :]* (\\d\\d\\d\\d\\d\\d)+" ); Matcher m = p.matcher(personInfo); while (m.find()){ System.out.print( " " + m.start()); System.out.println( ", 發現電話號碼 :" + m.group()); } } } import java.util.*;; class Main{ public static void main( String [] args){ String personInfo = " 姓名 : 王⼩明 ," + " 年齡 : 20," + " 姓別 : ," + " 電話 1: 037-412312 ," + " 電話 2: (0925)123456 ," + " 電話 3: 0987:561000 " ; Scanner s = new Scanner ( personInfo ); String token ; int count= 0 ; do { token = s.findInLine ( “[(]*\\d+[)-:]*(\\d\\d\\d\\d\\d\\d)+" ); if ( token != null ) { count++; System.out.println( " 找到第 " + count + " 個電號碼 :" + token ); } } while ( token != null ); } } Scanner 類別常⽤的⽅式如下: 中介字元 功能說明 [XYZ] 只有字元 X Y Z 才符合要 ; (X|Y|Z) 意義相同。範例: [XYZ]word 表⽰可以是 Xword Yword Zword [^XYZ] 不可包含有 X T Z 字元。範例: [^XYZ] word 表⽰不可以是 Xword Yword Zword [a-z] 可以是 a z 連續字元中的任何⼀個。範例: [a-c]word 表⽰可以是 aword bword cword [^a-z] 不可含有 a z 連續字元中的任何⼀個。 {n,m} n m 都是⼤於等於 0 的整數,但是 n ⼩於等於 m(n<=m); 代表指字元 出現次數介於 n~m 之間。範例: AB{2,4} 表⽰可以是 ABB ABBB ABBBB {n} 代表指定字元正好出現 n 次。範例: AB{2} 代表 ABB B 要出現正好 2 次。 {n,} 代表指定字元⾄少出現 n 次。 \d 可以是 0 9 任何⼀個數字 ; 相當於 [0-9] \D 不可以是 0 9 任何⼀個數字 ; 相當於 [^0-9] \s 可以是任何空⽩的字元,可以是 [\t\n\x\0B\f\r] \S 不可以是任何空⽩的字元。 \w 可以是⼀個英⽂字⺟或數字。 \W 不可以是⼀個英⽂字⺟或數字。 ( ) 括號內,表⽰⼀個群組。範例: (ABC){3} 代表 ABC 是⼀體,必須同 時出現 3 次,即 ABCABCABC \ 取消原運算符號的功能,使其變成單純⽂字。範例: 2010\*12\*25 代表取消「 * 」原來的功能。這個功能與 Java 跳脫符 號「 \ 」相同,長相也⼀樣。 . 任⼀字元。 量詞 功能說明 ? 指定字元最多出現 1 次,釓可以不出現。相當於 {0, 1} 。範例: X? YY 可以是 XYY XXXYY 。「 ? 」在 X 後⾯代表 X 出現次數受到「 ? 」所 限制。 + 指定字元⾄少出現 1 次以上。相當於 {1,} * 指定字元出現 0 次以上。相當於 {0,} 函式名稱 功能說明 findInLine() 以正規表⽰式 (regular expression) 找尋特定⽂字,回傳 nul ⽰已無符合的⽂字 useDelimiter() 指定字元間的分隔符號 ( 即被分隔的⽂字 ) ,其可使⽤正規表 ⽰式。 hasNext() 詢問是否還有下⼀個符號,回傳 true 為有, false 為沒有。 hasNextByte() 詢問是否還有下⼀個 byte 型別的符號,回傳 true 為有, false 為沒有。 hasNextShort() 詢問是否還有下⼀個 short 型別的符號,回傳 true 為有, false 為沒有。 hasNextInt() 詢問是否還有下⼀個 int 型別的符號,回傳 true 為有, false 沒有。 hasNextFloat() 詢問是否還有下⼀個 float 型別的符號,回傳 true 為有, false 為沒有。 hasNextDouble() 詢問是否還有下⼀個 double 型別的符號,回傳 true 為有, false 為沒有。 next() 取得下⼀個符號。 nextByte() 取得下⼀個符號,並以 byte 型別的資料回傳。 nextShort() 取得下⼀個符號,並以 short 型別的資料回傳。 nextInt() 取得下⼀個符號,並以 int 型別的資料回傳。 nextFloat() 取得下⼀個符號,並以 float 型別的資料回傳。 nextDouble() 取得下⼀個符號,並以 double 型別的資料回傳。 J12_2_1 – Main.java 1. 現在,有 1 個⼈員資訊,以字串的⽅式連結在⼀起。 J12_2_2 – Main.java 2. 當然,⼈員資訊中的電話資訊也連結在這個字串當中。 3. 若直接列出存放⼈員資訊的字串,除了⼈員的電話資訊外,還會包含 其他的⼈員資訊,有辦法將電話資訊分離出來,並只顯⽰電話資訊嗎? 1. 在此引入 “java.util.regex.*” 套件下的所有類別。 2. 這是整個⼈員的資訊,其中包含電話資訊。 3. 透過 Pattern 類別的 compile() 法,傳入參數以正規表⽰式( Regulare Expression )描述的搜尋字串,以透過 正規表⽰式描述希望搜尋的⽂字的格式。 5. ⽬前發現,電話號碼是以 9 碼或 10 碼的數字所組 成,因此使⽤ {9,10} \\d 之後,表⽰找出 9 10 的數值,如此就剛好與電話號碼的格式相符。 4. \d 即表⽰ 1 個數值的意思,使⽤ \\d 原因,是因為 \ 原為跳脫符號 \\ 表⽰中⽌跳 脫符號的功能,即表⽰ 1 \ 的意思。 6. 傳入整個⼈員資訊字串⾄ matcher() ⽅法中, matcher() ⽅法會回傳 Matcher 物件以進⾏後續搜尋的動作。 8. start() ⽅法會回傳比對成功(搜尋成功)的位置。 7. 呼叫 Matcher 物件的 find() ⽅法,當找到符合正規表⽰式的⽂字時, 會回傳 true 表⽰以找到,否則回傳 false ;在此搭配 while 持續的搜尋。 9. ⽽後呼叫 group() ⽅法可取得搜尋到的⽂字, 也就是我們希望找出的電話號碼。 J12_2_3 – Main.java 1. 這是整個⼈員的資訊,其中包含電話資訊。 2. 現在,電話號碼中多了特殊符號例如 -):” ,這樣就不是連續 9 10 位數的數字了,因此使⽤原本的正規表⽰式 “\\d{9,10}” 將無法找功找尋到電話號碼,且這些特殊符號⼜不是每個電話號碼都 有,⽽是會隨機出現在電話號碼中,這時怎麼辦呢? J12_2_4 – Main.java 1. 這是整個⼈員的資訊,其中包含電話資訊。 3. 使⽤ \\( 表⽰含有 ( 的字串, ⽽使⽤ \\ 的⽬的為 ( 原本即為正規 表⽰式的⼀部份,因此使⽤ \\ 脫此功能,⽽後⽅的星號*表⽰ 前⽅的字元 ( 可能出現 0 或多次。 4. 指定存在於特殊符號中的電話號碼可以出現 3 4 位的數字。 2. 這是含有特殊符號 -):” 的電話號碼。 5. 使⽤ \\)* ,表⽰ ) 可能出現 0 ⾄多次。 6. 使⽤ :* 表⽰ : 可能 出現 0 ⾄多次。 7. 使⽤ -* 表⽰ - 可能 出現 0 ⾄多次。 8. 指定電話號碼 剩下的 6 位數字。 J12_2_5 – Main.java 1. 這是整個⼈員的資訊,其中包含電話資訊。 2. 這是含有特殊符號 -):” 的電話號碼。 3. [(]* 表⽰位於 中括號 [] 中的 ( 可以 出現 0 ⾄多次。 . 使⽤加號 + \\d 後⽅,表⽰數字可以⾄ 少出現 1 次以上。 6. ⼩括號 () 可以⽂字群組在⼀起,因此使⽤⼩括號 () 將將6個 \\d 裝起 來,表⽰這6個 \\d 是為⼀個群組的⽂字,必須同時出現 6 個數值才會比對成 功,⽽在⼩括號後⽅加上加號 + ,表⽰⼩括號中的⽂字⾄少出現⼀次。 5. [)-:]* 表⽰位於中括號 [] 中的 )-: 可以出現 0 ⾄多 次,⽽且是選擇性的出現,因此中括號 [] 於正規表⽰式 的功能,就是讓位於中括號 [] 的⽂字可任選⼀個出現。 1. 這是整個⼈員的資訊,其中包含電話資訊。 2. 這是含有特殊符號 -):” 的電話號碼。 3. 建立 Scanner 物件,並將被搜尋的⼈員資訊字串作為建構式的參數。 4. 準備⼀個 token 變數,以存放搜尋的結果。 5. 使⽤ findInLine() ⽅法,並給予正規表⽰式字串指定 搜尋的⽂字格式,同時 findInLine() ⽅法會在呼叫回傳查 詢的結果。在此我們將查詢的結果存放於 token 變數中。 6. 若搜尋的結果不為 null ,表⽰有找到 符合的⽂字,在此即為我們希望搜尋的電 話號碼,並將此電話號碼印⾄畫⾯上。 7. 當搜尋的結果不為 null 時,則繼承透過 while 迴圈 進⾏搜尋的動作,直⾄搜尋的結果為 null 時離開。 J12_2_6 – Main.java 在下⼀⼩節將會針對除了 findInLine() ⽅法之外的其他⽅法作說明。 如何找出⼈員資訊中的電話資訊? Pattern Matcher 類別,幫你找出電話資訊 電話中有特殊符號,怎麼辦? 1 1 Scanner ,讓您參與搜尋電話號碼過程 Scanner 類別常⽤的⽅法

留言