<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在書寫正規表示式時,通常情況下,我們有兩種場景會使用到分組。
一是:對一個子表示式進行重複;二是:想要獲取到子表示式匹配到的內容。
如果需要重複單個字元,直接在字元后面加上限定符即可,例如 a+
表示匹配1個或一個以上的a,a?
表示匹配0個或1個a。
但是我們如果要對多個字元進行重複的話,就需要用到 分組 。
比如:(ab){3}
表示 ab 字元重複3次
正則中常用的限定符如下:
表示式 | 說明 |
---|---|
X ? | X ,一次或一次也沒有 |
X * | X ,零次或多次 |
X + | X ,一次或多次 |
X { n } | X ,恰好 n 次 |
X { n ,} | X ,至少 n 次 |
X { n , m } | X ,至少 n 次,但是不超過 m 次 |
比如表示式: [a-z]*d*[a-z]*
,它表示a-z的字元重複0到多次,後面緊跟0到多個數位,後面再跟上多個a-z的字元。
顯然,字串 abcd324232efg
是滿足匹配的串。那麼,如果我們只想要獲取到匹配串中數位 324232
後面的串 efg
呢?
這時,就可以通過分組的方式來改寫正規表示式: [a-z]*d*([a-z]*)
。這樣,我們就可以通過獲取第 1 個分組匹配到的內容來達到目的。
正則中通過小括號“()”
來指定需要重複的子表示式,然後再加上限定符對這個子表示式進行重複。
例如:(abc)? 表示0個或1個abc 。
一組括號裡面的表示式就表示一個分組 。
分組可以分為兩種形式,捕獲組和非捕獲組。
捕獲組和非捕獲組的區別就是:捕獲組表示的分組會捕獲文字(即:匹配字元),而非捕獲組表示的分組不會捕獲文字。
捕獲組可以通過從左到右計算其開括號來編號 。
例如,在表示式 (A)(B(C)) 中,存在四個這樣的組:
分組編號 | 分組編號對應的子表示式 |
---|---|
0 | (A)(B(C)) |
1 | (A) |
2 | (B(C)) |
3 | (C) |
注意:第0個分組始終代表整個表示式
分組的序號可以通過 Back 參照(反向參照) 在表示式中使用,也可以在匹配操作完成後從匹配器檢索出分組匹配到的內容。
反向參照的知識將會在後續的文章中進行分析。
在一個完整的正則中,如果我們只想獲取到某個子表示式匹配到的內容,就可以通過分組來達到目的。
比如:
待匹配串:abcd324232efg
想要獲取到這個字串中第二次連續出現的字母子串efg
我們可以通過分組的方式書寫正則: [a-z]*d*([a-z]*)
。
可以看到,我們通過子表示式([a-z]*)
來匹配第二次連續出現之母的子串,並且通過()
新增了分組,這樣,我們就可以通過分組來獲取到相應的匹配內容了。
具體的獲取方法不同的語言的語法可能會有差異,但是原理是相通的。
下面就來看一下 javascript 和 java 中是如何進行處理的?
var str = "abcd324232efg"; var reg = new RegExp("([a-z]*)(\d*)([a-z]*)"); var arr = str.match(reg); // 顯示匹配到的分組內容 alert(arr[0] + "===" + arr[1] + "===" + arr[2] + "===" + arr[3]); alert(RegExp.$1 + "-----" + RegExp.$2 + "----" + RegExp.$3);
上面的例子中,我新增了 3 個分組。
通過 arr[n]
和 RegExp.$n
的方式都能獲取到分組匹配內容。
在 javascript 中
d
需要進行跳脫
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 中,通過 Matcher.group(n)
的方式拿到分組匹配內容。
在 javascript 中
d
需要進行跳脫
分組通常有兩種使用場景:一是:對一個子表示式進行重複;二是:想要獲取到子表示式匹配到的內容。
分組是通過 ()
來表示的,它是通過從左到右計算其開括號來進行編號的。
/* * 正規表示式分組功能: * 捕獲組可以通過從左到右計算其開括號來編號。例如,在表示式 ((A)(B(C))) 中,存在四個這樣的組: * split(regex) 引數是正規表示式 返回值是一個陣列 * replaceAll(regex,replacement) 第一個引數是正規表示式, 第二個引數要替換成的字串 */ 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" 將第一組出現的多次都替換 第一組出現的一次 $ 代表首字元 */ String s = "我..我我...我....愛..愛愛愛....愛愛..學.學學..學學學...學習習..習...習.習.習......習習習習"; String s2 = s.replaceAll("\.+", ""); String s3 = s2.replaceAll("(.)\1+", "$1"); System.out.println(s3); } private static void demo5() { /* * 疊詞切割: "acyyfgttthjzzzzzko"; * (.)\1+ //1+代表第一組出現一次到多次 */ String s = "acyyfgttthjzzzzzko"; String regex = "(.)\1+"; //1+代表第一組出現一次到多次 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代表第一組又出現一次 \2代表第二組又出現一次 * (..)\1 \1代表第一組又出現了一次 */ //疊詞 飄飄亮亮,美美麗麗 String regex2 = "(.)\1(.)\2"; //\1代表第一組又出現一次 \2代表第二組又出現一次 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("快快樂樂".matches(regex)); //false } private static void demo3() { /* * replaceAll(regex,replacement) 第一個引數是正規表示式, 第二個引數要替換成的字串 */ 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) 引數是正規表示式 返回值是一個陣列 */ String s = "星期一.星期二.星期三.星期四"; String[] array = s.split("\."); System.out.println(Arrays.toString(array)); } private static void demo1() { /* * 校驗電話號碼 * 1.必須是5-15位數位 * 2.開頭不能位0 * 3.必須是純數位 */ 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 } }
到此這篇關於正規表示式高階用法之分組使用的文章就介紹到這了,更多相關正規表示式分組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45