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);
}
}
在使用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);
旗標的形式有兩種,
除了正常的旗標表示法,可使用嵌入旗標表示法(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,兩者會視為相同