正則表達(dá)式高級(jí)用法之分組的使用教程
分組的使用場(chǎng)景
在書(shū)寫(xiě)正則表達(dá)式時(shí),通常情況下,我們有兩種場(chǎng)景會(huì)使用到分組。
一是:對(duì)一個(gè)子表達(dá)式進(jìn)行重復(fù);二是:想要獲取到子表達(dá)式匹配到的內(nèi)容。
- 對(duì)子表達(dá)式進(jìn)行重復(fù)
如果需要重復(fù)單個(gè)字符,直接在字符后面加上限定符即可,例如 a+ 表示匹配1個(gè)或一個(gè)以上的a,a?表示匹配0個(gè)或1個(gè)a。
但是我們?nèi)绻獙?duì)多個(gè)字符進(jìn)行重復(fù)的話,就需要用到 分組 。
比如:(ab){3} 表示 ab 字符重復(fù)3次
正則中常用的限定符如下:
| 表達(dá)式 | 說(shuō)明 |
|---|---|
| X ? | X ,一次或一次也沒(méi)有 |
| X * | X ,零次或多次 |
| X + | X ,一次或多次 |
| X { n } | X ,恰好 n 次 |
| X { n ,} | X ,至少 n 次 |
| X { n , m } | X ,至少 n 次,但是不超過(guò) m 次 |
- 獲取到子表達(dá)式匹配到的內(nèi)容
比如表達(dá)式: [a-z]*\d*[a-z]*,它表示a-z的字符重復(fù)0到多次,后面緊跟0到多個(gè)數(shù)字,后面再跟上多個(gè)a-z的字符。
顯然,字符串 abcd324232efg 是滿足匹配的串。那么,如果我們只想要獲取到匹配串中數(shù)字 324232 后面的串 efg 呢?
這時(shí),就可以通過(guò)分組的方式來(lái)改寫(xiě)正則表達(dá)式: [a-z]*\d*([a-z]*)。這樣,我們就可以通過(guò)獲取第 1 個(gè)分組匹配到的內(nèi)容來(lái)達(dá)到目的。
分組的使用方法
正則中通過(guò)小括號(hào)“()”來(lái)指定需要重復(fù)的子表達(dá)式,然后再加上限定符對(duì)這個(gè)子表達(dá)式進(jìn)行重復(fù)。
例如:(abc)? 表示0個(gè)或1個(gè)abc 。
一組括號(hào)里面的表達(dá)式就表示一個(gè)分組 。
捕獲組
分組可以分為兩種形式,捕獲組和非捕獲組。
捕獲組和非捕獲組的區(qū)別就是:捕獲組表示的分組會(huì)捕獲文本(即:匹配字符),而非捕獲組表示的分組不會(huì)捕獲文本。
捕獲組可以通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào) 。
例如,在表達(dá)式 (A)(B(C)) 中,存在四個(gè)這樣的組:
| 分組編號(hào) | 分組編號(hào)對(duì)應(yīng)的子表達(dá)式 |
|---|---|
| 0 | (A)(B(C)) |
| 1 | (A) |
| 2 | (B(C)) |
| 3 | (C) |
注意:第0個(gè)分組始終代表整個(gè)表達(dá)式
分組的序號(hào)可以通過(guò) Back 引用(反向引用) 在表達(dá)式中使用,也可以在匹配操作完成后從匹配器檢索出分組匹配到的內(nèi)容。
反向引用的知識(shí)將會(huì)在后續(xù)的文章中進(jìn)行分析。
分組的使用實(shí)例
在一個(gè)完整的正則中,如果我們只想獲取到某個(gè)子表達(dá)式匹配到的內(nèi)容,就可以通過(guò)分組來(lái)達(dá)到目的。
比如:
待匹配串:abcd324232efg
想要獲取到這個(gè)字符串中第二次連續(xù)出現(xiàn)的字母子串efg
我們可以通過(guò)分組的方式書(shū)寫(xiě)正則: [a-z]*\d*([a-z]*)。
可以看到,我們通過(guò)子表達(dá)式([a-z]*)來(lái)匹配第二次連續(xù)出現(xiàn)之母的子串,并且通過(guò)()添加了分組,這樣,我們就可以通過(guò)分組來(lái)獲取到相應(yīng)的匹配內(nèi)容了。
具體的獲取方法不同的語(yǔ)言的語(yǔ)法可能會(huì)有差異,但是原理是相通的。
下面就來(lái)看一下 javascript 和 java 中是如何進(jìn)行處理的?
javascript 獲取分組內(nèi)容
var str = "abcd324232efg";
var reg = new RegExp("([a-z]*)(\\d*)([a-z]*)");
var arr = str.match(reg);
// 顯示匹配到的分組內(nèi)容
alert(arr[0] + "===" + arr[1] + "===" + arr[2] + "===" + arr[3]);
alert(RegExp.$1 + "-----" + RegExp.$2 + "----" + RegExp.$3);
上面的例子中,我添加了 3 個(gè)分組。
通過(guò) arr[n] 和 RegExp.$n 的方式都能獲取到分組匹配內(nèi)容。
在 javascript 中
\d需要進(jìn)行轉(zhuǎn)義
java 獲取分組內(nèi)容
public static void main(String[] args) {
String str = "abcd324232efg";
Pattern pattern = Pattern.compile("([a-z]*)(\\d*)([a-z]*)");
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println(matcher.group());
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}
}
在 java 中,通過(guò) Matcher.group(n) 的方式拿到分組匹配內(nèi)容。
在 javascript 中
\d需要進(jìn)行轉(zhuǎn)義
小結(jié)
分組通常有兩種使用場(chǎng)景:一是:對(duì)一個(gè)子表達(dá)式進(jìn)行重復(fù);二是:想要獲取到子表達(dá)式匹配到的內(nèi)容。
分組是通過(guò) () 來(lái)表示的,它是通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)進(jìn)行編號(hào)的。
補(bǔ)充:正則表達(dá)式分組及常見(jiàn)的方法
/*
* 正則表達(dá)式分組功能:
* 捕獲組可以通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào)。例如,在表達(dá)式 ((A)(B(C))) 中,存在四個(gè)這樣的組:
* split(regex) 參數(shù)是正則表達(dá)式 返回值是一個(gè)數(shù)組
* replaceAll(regex,replacement) 第一個(gè)參數(shù)是正則表達(dá)式, 第二個(gè)參數(shù)要替換成的字符串
*/
import java.util.Arrays;
public class RegexApply {
public static void main(String[] args) {
// TODO Auto-generated method stub
// demo1();
// demo2();
// demo3();
// demo4();
// demo5();
// demo6();
}
private static void demo6() {
/*
* \\. "" 將所有的. 替換為空字符串
* (.)\\1+ "$1" 將第一組出現(xiàn)的多次都替換 第一組出現(xiàn)的一次 $ 代表首字符
*/
String s = "我..我我...我....愛(ài)..愛(ài)愛(ài)愛(ài)....愛(ài)愛(ài)..學(xué).學(xué)學(xué)..學(xué)學(xué)學(xué)...學(xué)習(xí)習(xí)..習(xí)...習(xí).習(xí).習(xí)......習(xí)習(xí)習(xí)習(xí)";
String s2 = s.replaceAll("\\.+", "");
String s3 = s2.replaceAll("(.)\\1+", "$1");
System.out.println(s3);
}
private static void demo5() {
/*
* 疊詞切割: "acyyfgttthjzzzzzko";
* (.)\\1+ //1+代表第一組出現(xiàn)一次到多次
*/
String s = "acyyfgttthjzzzzzko";
String regex = "(.)\\1+"; //1+代表第一組出現(xiàn)一次到多次
String[] arr = s.split(regex);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void demo4() {
/*
* 疊詞 捕獲組 (.)\\1(.)\\2 \\1代表第一組又出現(xiàn)一次 \\2代表第二組又出現(xiàn)一次
* (..)\\1 \\1代表第一組又出現(xiàn)了一次
*/
//疊詞 飄飄亮亮,美美麗麗
String regex2 = "(.)\\1(.)\\2"; //\\1代表第一組又出現(xiàn)一次 \\2代表第二組又出現(xiàn)一次
System.out.println("漂漂亮亮".matches(regex2)); //true
System.out.println("美美麗麗".matches(regex2)); //false
System.out.println("高高興興".matches(regex2)); //true
System.out.println("死啦死啦".matches(regex2)); //false
System.out.println("----------------------");
//疊詞 漂亮漂亮,美麗美麗
String regex = "(..)\\1";
System.out.println("死啦死啦".matches(regex)); //true
System.out.println("高興高興".matches(regex)); //true
System.out.println("快快樂(lè)樂(lè)".matches(regex)); //false
}
private static void demo3() {
/*
* replaceAll(regex,replacement) 第一個(gè)參數(shù)是正則表達(dá)式, 第二個(gè)參數(shù)要替換成的字符串
*/
String s = "aaoo1ddd3jgjao";
String regex = "\\d";
String s2 = s.replaceFirst(regex, "");
String s3 = s.replaceAll(regex, "");
System.out.println(s2); //aaooddd3jgjao
System.out.println(s3); //aaoodddjgjao
}
private static void demo2() {
/*
* split(regex) 參數(shù)是正則表達(dá)式 返回值是一個(gè)數(shù)組
*/
String s = "星期一.星期二.星期三.星期四";
String[] array = s.split("\\.");
System.out.println(Arrays.toString(array));
}
private static void demo1() {
/*
* 校驗(yàn)電話號(hào)碼
* 1.必須是5-15位數(shù)字
* 2.開(kāi)頭不能位0
* 3.必須是純數(shù)字
*/
String regex = "[1-9]\\d{5,15}";
System.out.println("804360385".matches(regex)); //true
System.out.println("430763075439703307503".matches(regex)); //false
System.out.println("03534534".matches(regex)); //false
}
}
總結(jié)
到此這篇關(guān)于正則表達(dá)式高級(jí)用法之分組使用的文章就介紹到這了,更多相關(guān)正則表達(dá)式分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)會(huì)Python正則表達(dá)式,就看這20個(gè)例子(腳本之家修正版)
這篇文章主要介紹了學(xué)會(huì)Python正則表達(dá)式,就看這20個(gè)例子,需要的朋友可以參考下2020-03-03
分享一組開(kāi)源的匹配中國(guó)大陸手機(jī)號(hào)碼的正則表達(dá)式
這篇文章主要介紹了分享一組開(kāi)源的匹配中國(guó)大陸手機(jī)號(hào)碼的正則表達(dá)式。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
最新手機(jī)號(hào)碼、電話號(hào)碼正則表達(dá)式
相信大家對(duì)正則表達(dá)式一定都有所了解和研究,這篇文章主要為大家分享了最新驗(yàn)證手機(jī)號(hào)碼和電話號(hào)碼的正則表達(dá)式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11

