廖雪峰Java9正則表達式-2正則表達式進階-3分組匹配


1.使用括號可以提取字符串

不加括號匹配電話號碼

匹配成功后,如何提取想要的字符串?
使用(...)可以分組:"^(\d{3,4})\-(\d{6,8})$"

2.String.matcher vs Pattern.matcher

前面用到的正則表達式是使用String.matches(),而我們在分組時用到的是java.util.regex.Matcher和java.util.regex.Pattern。而String.matches()內部就是調用的Matcher和Pattern類的方法。
反復使用一個正則表達式字符串進行快速匹配效率較低:

  • 正則表達式雖然是一個字符串,但首先要編譯為Pattern對象 ,然后再進行匹配。因此可以先創建Pattern對象,然后反復使用
    public static void main(String[] args){
        //使用String.matches匹配
        String regex = "^\\d{3,4}\\-\\d{6,8}";
        System.out.println("使用String.matches進行匹配:"+"010-123456789".matches(regex));
        //使用Pattern類定義正則表達式
        Pattern pattern = Pattern.compile("^(\\d{3,4})\\-(\\d{6,8})$");
        //使用Pattern的matches匹配
        System.out.println("使用Pattern.matches進行匹配:"+pattern.matcher("010-12345678").matches());
        //獲取matcher對象,在獲取匹配結果
        Matcher matcher = pattern.matcher("010-12345678");
        System.out.println("轉換為Matcher對象進行匹配:"+matcher.matches());

    }

3.使用Matcher.group(n)可以快速提取字串

    public static void main(String[] args) throws IllegalAccessException {
        Pattern pattern = Pattern.compile("^(\\d{3,4})\\-(\\d{6,8})$");
        //獲取matcher對象
        Matcher matcher = pattern.matcher("010-1234567");
        //必須匹配成功,才能提取子串,即matcher.matches()不能省略,否則會報java.lang.IllegalStateException,
        try{
            System.out.println(matcher.group(0));
        }catch (Exception e){
            System.out.println(e.getClass()+": "+e.getMessage());
        }
        //因此可以改寫為
        if (matcher.matches()) {
            System.out.println(matcher.group(0));
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(2));
        }
    }
## 4.示例 Tel.java ```#java package com.testList;

import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Tel {
//Pattern對象是可以反復使用的
static Pattern p = Pattern.compile("^(0\d{2,3})\-([1-9]\d{5,7})$");
public static Tel parse(String s){//返回類型為Tel,同public boolean 方法名(){}
Matcher m = p.matcher(s);
if(m.matches()){
String s1 = m.group(1);
String s2 = m.group(2);
return new Tel(s1,s2);
}
return null;
}
private final String areaCode;
private final String phone;
public Tel(String areaCode, String phone){
this.areaCode = areaCode;
this.phone = phone;
}
public String getAreaCode(){
return areaCode;
}
public String getPhone(){
return phone;
}
@Override
public boolean equals(Object o){
if(o==this){
return true;
}
if( o instanceof Tel){
Tel t = (Tel) o;
return Objects.equals(t.areaCode,this.areaCode) && Objects.equals(t.phone,this.phone);
}
return false;
}
@Override
public int hashCode(){
return Objects.hash(this.areaCode,this.phone);
}
@Override
public String toString(){
return this.areaCode + "-" + this.phone;
}
}

TelTest.java
```#java
package com.testList;

import org.junit.Test;

import static org.junit.Assert.*;

public class TelTest {

    @Test
    public void testIsVaildTes() {
        assertEquals(new Tel("010","123456"),Tel.parse("010-123456"));
        assertEquals(new Tel("010","12345678"),Tel.parse("010-12345678"));

        assertNull(Tel.parse("123-12345678"));
        assertNull(Tel.parse("010-0123456"));
        assertNull(Tel.parse("010#12345678"));
    }
}

5.總結:

正則表達式分組可以通過Matcher對象快速提取字串:

  • group(0)表示匹配的整個字符串
  • group(1)表示第1個子串
  • group(2)表示第2個子串
  • ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM