網頁

2017/8/15

Regex matches()和find()的差異

Java的正規表示式(Regular Expression, regex)簡單用法如下


Pattern p = Pattern.compile("^he");   // Pattern.compile()的參數"^he"為正規表示式
Matcher m = p.matcher("hello world"); // matcher()的參數字串為要以正規表示式檢查的字串
System.out.println(m.find());         // 若檢查的字串的子字串符合正規表示式的規則,Matcher.find()回傳true

"^he"是正規表示式的語法規則,用來檢查字串是否以"he"為開頭。
^符號代表從字串的開頭來檢查後接的文字是否符合規則。

Pattern.compile()建立一個正規表示式的Pattern物件,然後Pattern物件p呼叫matcher()方法並傳入要檢查的字串取得Matcher物件 m,最後呼叫Matcher.find()來執行檢查。



要注意Matcher.matches()Matcher.find()是有差別的,matches()是將查詢字串的全部來做匹配,而find()是將查詢字串的子字串來作匹配,例如以下


String regex = "^he";
String s = new String("hello world");
  
Pattern p = Pattern.compile(regex);   
Matcher m = p.matcher(s);
System.out.println(m.matches());    // => false 
System.out.println(m.find());       // => true

因此matches()find()的結果不同,matches()是將整個"hello world"用正規表示式來匹配,所以回傳false, 而find()是用"hello world"的子字串來做匹配,例如"he",所以回傳true。

String.matches()的功能同Matcher.matches()

find()在使用上要注意的另外一點是,如果之前已經找到一個匹配的結果,若再呼叫一次find()Matcher是從前一次呼叫時未批配的第一個字元的位置開始查找,而不是從頭開始,例如以下


String regex = "^he";
String s = new String("hello world");
  
Pattern p = Pattern.compile(regex);   
Matcher m = p.matcher(s);
System.out.println(m.find());    // => true
System.out.println(m.find());    // => false

若要讓Matcher從頭開始搜尋字串,呼叫Matcher.reset()方法來重置

請參考Difference between matches() and find() in Java Regex

沒有留言:

張貼留言