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個子串
- ...
