()表示捕獲分組,獲取匹配,()把每個(gè)分組里的匹配的值保存起來(lái)
(?:)表示非捕獲分組,獲取匹配,非捕獲分組匹配的值不會(huì)保存起來(lái),可以提高程序執(zhí)行速度
(?=?!?<=?<!)表示非捕獲分組,不獲取匹配,也不保存匹配的值
舉例說(shuō)明:
// 是否獲取匹配 測(cè)試文本 abxoxcd ..(xox).. 匹配 abxoxcd ..(?:xox).. 匹配 abxoxcd ..(?=xox).. 匹配 abxo 獲取匹配,一般匹配到了字符之后,該字符就被消耗、輸出。不獲取匹配,不會(huì)消耗字符。 // 是否保存匹配的值 測(cè)試文本 AAABBCaaA E666FF (A)\1* 匹配 AAA、A (\w)\1+ 匹配 AAA、BB、aa、666、FF (?:A)(B)\1* 匹配 ABB 因?yàn)榉遣东@分組不保存匹配的值,所以 (?:A)(B)\1* 匹配 ABB 第一個(gè)\1表示(B)這個(gè)捕獲組捕獲到的值。 “注意:反向引用表示捕獲到的值,而不是再次使用正則表達(dá)式” 這里用到了一個(gè)新的知識(shí)點(diǎn),反向引用。
??
boardmix博思白板,一個(gè)點(diǎn)燃團(tuán)隊(duì)協(xié)作和激發(fā)創(chuàng)意的空間,集aigc,一鍵PPT,思維導(dǎo)圖,筆記文檔多種創(chuàng)意表達(dá)能力于一體,將團(tuán)隊(duì)工作效率提升到新的層次。
? 1、正則表達(dá)式中??“ umber”?表示反向引用,表示引用一個(gè)捕獲組,需要和小括號(hào)?“()”?一起使用
? 2、正則捕獲組的下標(biāo)從 0 開(kāi)始,下標(biāo)為 0 的組是整個(gè)表達(dá)式,下標(biāo)為 1 的表示從左到右開(kāi)始的第一個(gè)左括號(hào)所包含的值,后面的數(shù)字以此類推
? 3、捕獲組在匹配成功時(shí),會(huì)將子表達(dá)式匹配到的內(nèi)容,保存到內(nèi)存中一個(gè)以數(shù)字編號(hào)的組里,可以簡(jiǎn)單的認(rèn)為是對(duì)一個(gè)局部變量進(jìn)行了賦值,這時(shí)就可以通過(guò)反向引用的方式,引用這個(gè)局部變量的值。
? 4、反向引用必須要與捕獲組一同使用,如果沒(méi)有捕獲組,而使用了反向引用的語(yǔ)法,不同語(yǔ)言的處理方式不一致,有的語(yǔ)言會(huì)拋異常,有的語(yǔ)言會(huì)當(dāng)作普通的轉(zhuǎn)義處理
// 前瞻: exp1(?=exp2) 查找exp2前面的exp1 // 后顧: (?<=exp2)exp1 查找exp2后面的exp1 // 負(fù)前瞻: exp1(?!exp2) 查找后面不是exp2的exp1 // 負(fù)后顧: (?<!exp2)exp1 查找前面不是exp2的exp1
舉例說(shuō)明:
// 正向預(yù)查和反向預(yù)查 測(cè)試文本 abxoxcd ..(?=xox) 匹配 ab ..(?=oxo) 匹配不到 (?=xox).. 匹配xo (?<=xox).. 匹配 cd 預(yù)查只需要記?。?、環(huán)顧全局定位到非捕獲組;2、不獲取匹配(不消耗字符),不保存匹配的值(不能使用反向引用)
提問(wèn):強(qiáng)密碼(必須包含數(shù)字、小寫(xiě)字母和大寫(xiě)字母三種字符,即這三種字符的組合,且不能使用特殊字符,長(zhǎng)度在8-16之間),你認(rèn)為必須是 1個(gè)數(shù)字+1個(gè)小寫(xiě)字母+1個(gè)大寫(xiě)字母 這種順序嗎?
?^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$
(?=.*[0-9])表示任意字符+一個(gè)數(shù)字
(?=.*[a-z])表示任意字符+一個(gè)小寫(xiě)字母
(?=.*[A-Z])表示任意字符+一個(gè)大寫(xiě)字母
[0-9a-zA-Z]{8,16}表示8-16個(gè)數(shù)字、大小寫(xiě)字母
當(dāng)有多個(gè)正向預(yù)查規(guī)則時(shí)它們是并列的,不是串行的
測(cè)試文本 abc2abc \d(?=a)(?=b) 匹配不到 \d(?=a)(?=.b) 匹配 2 當(dāng)然這是為了演示它的規(guī)則,其實(shí)可以寫(xiě) \d(?=ab) 這里主要的原因是:不獲取匹配(不消耗字符)。 對(duì)于 ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$ 其實(shí)整個(gè)正則表示可以分為三部分: /^(?=.*[0-9])[0-9a-zA-Z]{8,16}$/ /^(?=.*[a-z])[0-9a-zA-Z]{8,16}$/ /^(?=.*[A-Z])[0-9a-zA-Z]{8,16}$/ 待匹配字符串必須同時(shí)滿足這三部分才可以
以上就是Java的正則?:?=?!是什么意思的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
java怎么學(xué)習(xí)?java怎么入門(mén)?java在哪學(xué)?java怎么學(xué)才快?不用擔(dān)心,這里為大家提供了java速學(xué)教程(入門(mén)到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)