java 如何用pattern 和 Matcher 來使用正則表達式


java的regex庫

java里預留了一個regex庫,方便於我們在java里操作正則表達式,或者用它來匹配字符串。

其中比較常用的就是 Pattern 和 Matcher ,pattern是一個編譯好的正則表達式,而Mather是一個正則表達式適配器,Mather的功能很強大,所以我們一般用pattern 來獲取一個Matcher對象,然后用Matcher來操作正則表達式。先看一下這兩個類的用法吧、

Pattern

創建pattern的對象是很簡單的,但是由於pattern的構造方法是用private聲明的,所以我們僅能通過工廠模式的compile方法來返回一個Pattern的對象。

Pattern pattern = Pattern.compile("[abc]");

compile可以接收一個正則表達式作為參數。

接下來我們創建一個Matcher對象。Matcher的構造方法也是一個private方法,但是我們可以通過Pattern的Matcher方法來返回一個Matcher對象。

Matcher matcher = pattern.matcher("hello abc");

這里matcher可以接收一個字符串作為參數,准確的說這里所接收的參數類型是CharSequences接口類型的參數,但是String、StringBuffer、StringBuilder還有CharBuffer都實現了CharSequence接口,因此我們向里面傳入這四種任何我們需要的參數。

與此同時Pattern還提供了一個matches 靜態方法,它允許我們傳入一個String類型的正則表達式和一個String類型的需要匹配的字符串,並返回一個boolean類型的值,這個方法的好處在於我們可以不用創建pattern對象和matcher對象就可以知道所傳入的正則表達式能不能匹配所傳入的字符串。

boolean bool = Pattern.matches("\\w+","hello abc");

Watcher

說到Wather,這個東西就很強大了,我們比較常用的方法有:

find();
group();

(1)先來說一下find()和group這兩個方法。
find有點像一個迭代器,它能通過正則表達式向前迭代。
下來看一個例子

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("\\w+");
		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
		//find向前迭代
		while(matcher.find()){
			System.out.println(matcher.group());
		}
	}
}

我們先來看看jdk給出的api怎么定義find的;
boolean find();
可以知道find返回的是一個boolean值,當前方沒有內容的時候,find會返回false,所以我們這里可以直接用while來寫,這句代碼打印出的內容是

hello
abc
bbc
cbc
ccc

可以看到其實我們的正則表達式"\\w+"只匹配到了第一個單詞hello ,但是因為find迭代的關系,把后面的單詞全部都打印出來了,參照的正是我們給出的正則表達式。

(2)group
說到find就不得不說group。
下面看個式子

(a(b)(c(d)))

這里的話我們把整個式子稱為第0組,
第一組是 a(b)(c(d))
第二組是 子式 b 和 子式c(d)
第三組是 d

看一下幾個group方法
int groupCount()
返回此匹配器模式中的捕獲組數
這個方法也就是返回所匹配的字符串的組數。

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("(\\w+)\\d+");
		Matcher matcher = pattern.matcher("hello123 abc bbc cbc ccc");
		matcher.find();
		System.out.println(matcher.groupCount());
	}
}

這里匹配到的是hello123, 當然不加()也能得到,這里只是為了方便演示。
打印出來的數值是1,這是因為我們只有一個組

那group();呢

String group()
返回由以前匹配操作所匹配的輸入子序列。

也就是說group是返回所匹配到的第0組的值,返回值是一個String。這也能解釋我們剛剛用find進行迭代的那個例子了。

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("\\w+");
		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
		//find向前迭代
		while(matcher.find()){
			System.out.println(matcher.group());
		}
	}
}

這里沒有分組所以直接將匹配到的String打印出來,其實也就是第0組.

另外 group還有個重載的方法,可以接收一個int類型的參數

String group(int group)
返回在以前匹配操作期間由給定組捕獲的輸入子序列。
傳入的參數正是組數.

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("(\\w+)\\s\\d+");
		Matcher matcher = pattern.matcher("hello 123 abc bbc cbc ccc");
		matcher.find();
		System.out.println(matcher.group(1));
	}
}

打印出來的結果正在我們的意料之中是hello。

除此之外還有兩個可以返回匹配當前字符串的索引的方法。

int start();
int end();

其中start是返回匹配成功的子串的第一個字母的索引,而end是返回子串最后一個索引的位置+1.

String input = "hello abc BBc Cbc ccc";
		Matcher matcher = Pattern.compile("[A-Z][A-Z]\\w").matcher(input);
		matcher.find();
		System.out.println(input.charAt(matcher.start()));

這里打印出來的值是B。但是如果我們換成end就不一樣了。

System.out.println(input.charAt(matcher.end()));

這里打印出來的值卻是“ ”是一個空字符,也就是c的索引加了1,所以我們這里只需稍作修改便可以打印出c了。

System.out.println(input.charAt(matcher.end()-1));

java的regex庫

java里預留了一個regex庫,方便於我們在java里操作正則表達式,或者用它來匹配字符串。

其中比較常用的就是 Pattern 和 Matcher ,pattern是一個編譯好的正則表達式,而Mather是一個正則表達式適配器,Mather的功能很強大,所以我們一般用pattern 來獲取一個Matcher對象,然后用Matcher來操作正則表達式。先看一下這兩個類的用法吧、

Pattern

創建pattern的對象是很簡單的,但是由於pattern的構造方法是用private聲明的,所以我們僅能通過工廠模式的compile方法來返回一個Pattern的對象。

Pattern pattern = Pattern.compile("[abc]");

compile可以接收一個正則表達式作為參數。

接下來我們創建一個Matcher對象。Matcher的構造方法也是一個private方法,但是我們可以通過Pattern的Matcher方法來返回一個Matcher對象。

Matcher matcher = pattern.matcher("hello abc");

這里matcher可以接收一個字符串作為參數,准確的說這里所接收的參數類型是CharSequences接口類型的參數,但是String、StringBuffer、StringBuilder還有CharBuffer都實現了CharSequence接口,因此我們向里面傳入這四種任何我們需要的參數。

與此同時Pattern還提供了一個matches 靜態方法,它允許我們傳入一個String類型的正則表達式和一個String類型的需要匹配的字符串,並返回一個boolean類型的值,這個方法的好處在於我們可以不用創建pattern對象和matcher對象就可以知道所傳入的正則表達式能不能匹配所傳入的字符串。

boolean bool = Pattern.matches("\\w+","hello abc");

Watcher

說到Wather,這個東西就很強大了,我們比較常用的方法有:

find();
group();

(1)先來說一下find()和group這兩個方法。
find有點像一個迭代器,它能通過正則表達式向前迭代。
下來看一個例子

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("\\w+");
		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
		//find向前迭代
		while(matcher.find()){
			System.out.println(matcher.group());
		}
	}
}

我們先來看看jdk給出的api怎么定義find的;
boolean find();
可以知道find返回的是一個boolean值,當前方沒有內容的時候,find會返回false,所以我們這里可以直接用while來寫,這句代碼打印出的內容是

hello
abc
bbc
cbc
ccc

可以看到其實我們的正則表達式"\\w+"只匹配到了第一個單詞hello ,但是因為find迭代的關系,把后面的單詞全部都打印出來了,參照的正是我們給出的正則表達式。

(2)group
說到find就不得不說group。
下面看個式子

(a(b)(c(d)))

這里的話我們把整個式子稱為第0組,
第一組是 a(b)(c(d))
第二組是 子式 b 和 子式c(d)
第三組是 d

看一下幾個group方法
int groupCount()
返回此匹配器模式中的捕獲組數
這個方法也就是返回所匹配的字符串的組數。

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("(\\w+)\\d+");
		Matcher matcher = pattern.matcher("hello123 abc bbc cbc ccc");
		matcher.find();
		System.out.println(matcher.groupCount());
	}
}

這里匹配到的是hello123, 當然不加()也能得到,這里只是為了方便演示。
打印出來的數值是1,這是因為我們只有一個組

那group();呢

String group()
返回由以前匹配操作所匹配的輸入子序列。

也就是說group是返回所匹配到的第0組的值,返回值是一個String。這也能解釋我們剛剛用find進行迭代的那個例子了。

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("\\w+");
		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
		//find向前迭代
		while(matcher.find()){
			System.out.println(matcher.group());
		}
	}
}

這里沒有分組所以直接將匹配到的String打印出來,其實也就是第0組.

另外 group還有個重載的方法,可以接收一個int類型的參數

String group(int group)
返回在以前匹配操作期間由給定組捕獲的輸入子序列。
傳入的參數正是組數.

public class Main {
	public static void main(String[] args){
		Pattern pattern = Pattern.compile("(\\w+)\\s\\d+");
		Matcher matcher = pattern.matcher("hello 123 abc bbc cbc ccc");
		matcher.find();
		System.out.println(matcher.group(1));
	}
}

打印出來的結果正在我們的意料之中是hello。

除此之外還有兩個可以返回匹配當前字符串的索引的方法。

int start();
int end();

其中start是返回匹配成功的子串的第一個字母的索引,而end是返回子串最后一個索引的位置+1.

String input = "hello abc BBc Cbc ccc";
		Matcher matcher = Pattern.compile("[A-Z][A-Z]\\w").matcher(input);
		matcher.find();
		System.out.println(input.charAt(matcher.start()));

這里打印出來的值是B。但是如果我們換成end就不一樣了。

System.out.println(input.charAt(matcher.end()));

這里打印出來的值卻是“ ”是一個空字符,也就是c的索引加了1,所以我們這里只需稍作修改便可以打印出c了。

System.out.println(input.charAt(matcher.end()-1));

matcher 和 lookingAt

這兩個方法都返回一個boolean值,不同的是matcher是將整個輸入序列拿去匹配,而lookingAt一旦匹配成功一個子串就返回true。

public class Main {
	public static void main(String[] args){
		String s="aaaaaaaaaabbbbbbbbb";
		Matcher matcher = Pattern.compile("a+").matcher(s);
		System.out.println(matcher.lookingAt());//true
	}
}

這里匹配到的是aaaaaaaaaaa,因為用的是lookingAt,所以直接返回true了

如果換做是matches()。

System.out.println(matcher.matches());//false

即返回false


免責聲明!

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



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