Java的Regex中的Pattern Class (1)

MartinYeung
·
·
IPFS
·

閱讀時間: 10分鐘

Regular expression(簡稱Regex) 在解析及驗證的時候是最花時間的,在經常使用某規則運算式(簡稱Regex)的情況下,會導致系統的效率降低。

java.util.regex.Pattern 是其中一個主要連接Regular expression的API。

而Pattern Class 可以改善效率的問題。

使用Pattern Class有兩種方式。

分別是

Pattern.matches()

用作快速配對在String上。

Pattern.compile()

用作快速配對在String上,可以重複多次使用在不同的text上。

Pattern 的建構式被標示為 private,無法用 new 建構 Pattern 實例,必須透過 Pattern 的靜態方法 compile 來建構,在解析及驗證過規則運算式之後,將會傳回 Pattern 實例,之後就可以重複使用這個實例。

例子:

Pattern.matches(), 會返回true假如s包含3個字母(letter)

public boolean isThreeLetters(String s){
        return s.matches("[a-zA-Z]{3}");
// simpler from for
// return s.matches("[a-Z][a-Z][a-Z]");

Pattern.compile(), 驗證Regex是不是在actualString中

import java.util.regex.*; 
public class compileCase{ 
    public static void main(String[] args) 
    { 
        //首先創建一個Regex String REGEX = ".*www.*"; 
  
        // 創建一個String, 會被用於搜尋的textString actualString 
            = "www.uppengarden.com"; 
  
        // 使用compile() method 
        Pattern pattern = Pattern.compile(REGEX); 
  
        // 創建一個 matcher物件 
        Matcher matcher = pattern.matcher(actualString); 
  
        // 驗證REGEX是否在actualString中boolean matches = matcher.matches(); 
  
        System.out.println("actualString "
                           + "contains REGEX = "
                           + matches); 
    } 
}

重點 1:

在使用Pattern.compile()時,可以有其他方式。

正常的形式是:

Pattern pattern = Pattern.compile(REGEX);
// REGEX 是String, String REGEX = ".*uppengarden.*";

或者

Pattern pattern = Pattern.compile(".*uppengarden");

另一形式是可以指定旗標

例如想不分大小寫比對 uppengarden文字,可以這樣做,如下:

Pattern pattern = Pattern.compile("uppengarden", Pattern.CASE_INSENSITIVE);

重點 2:

旗標的形式有兩種,

除了正常的旗標表示法,可使用嵌入旗標表示法(Embedded Flag Expression)。Pattern.CASE_INSENSITIVE的嵌入旗標表示法為 (?i)

Pattern pattern = Pattern.compile("(?i)uppengarden");

若想對特定分組嵌入旗標,可以使用 (?i:uppengarden) 這樣的語法,以下是能使用的語法:

Pattern.CASE_INSENSITIVE:(?i)

Pattern.COMMENTS:(?x)

Pattern.MULTILINE:(?m)

Pattern.DOTALL:(?s)

Pattern.UNICODE_CASE:(?u)

Pattern.UNICODE_CHARACTER_CLASS:(?U)

Pattern.UNIX_LINES:(?d)

Pattern.CANON_EQ 與 Pattern.LITERAL 沒有對應的嵌入式表示法。Pattern.CANON_EQ 會啟用 Canonical equivalence,簡單來說,像 å 字元(U+00E5),也會使用 a 與 ̊ 組合標示(combining mark)(U+030A)來表示,對 Pattern 來說,預設兩個是不等價的,然而啟用了 Pattern.CANON_EQ,兩者會視為相同

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!

MartinYeungLove life Love IT IT blog: https://ithelp.ithome.com.tw/users/20119569
  • 来自作者
  • 相关推荐

Java - Volatile keyword的介紹

Java - Atomic VS Volatile

Java - Thread-Safety是什麼 - Part 3