iT邦幫忙

0

Java的Regex中的Pattern Class (1)

閱讀時間: 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, 會被用於搜尋的text
        String 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,兩者會視為相同


尚未有邦友留言

立即登入留言