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