Java正則環視和反向引用功能與用法詳解,java環視用法詳解
本文執行個體講述了Java正則環視和反向引用功能與用法。分享給大家供大家參考,具體如下:
環視
1、環視概念
環視,又稱為零寬斷言,簡稱斷言。
環視強調位置(前面或後面),必須匹配環視運算式,才能匹配成功。
環視可認為是虛擬加入到它所在位置的附加判斷條件,並不消耗正則的匹配字元。
2、環視基礎資料表達式
(?=Expression) 順序肯定環視,表示所在位置右側能夠匹配Expression
(?!Expression) 順序否定環視,表示所在位置右側不能匹配Expression
(?<=Expression) 逆序肯定環視,表示所在位置左側能夠匹配Expression
(?<!Expression) 逆序否定環視,表示所在位置左側不能匹配Expression
Note:順序(=)右側匹配,逆序環視比順序環視多了個<。
JavaScript中只支援順序環視,不支援逆序環視。
Java中雖然順序環視和逆序環視都支援,但是逆序環視只支援長度確定的運算式,逆序環視中量詞只支援?,不支援其它長度不定的量詞。
3、使用樣本
3.1、順序肯定環視(?=Expression)
3.1.1、匹配尾碼結尾是“.txt”的不含尾碼的檔案名稱
【.+(?=\.txt)】
文本:
txtfile.txt
exefile.exe
inifile.ini
匹配結果:txtfile
3.1.2、匹配密碼(必須包含字母(不區分大小寫)、數字,6-16位)
【^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,16}$】
(?=.*?[a-zA-Z]) 限定後面的字元中至少有一個字母,使用 (?=.*?[0-9]) 限定後面的字元中至少有一個數字,最後通過實際匹配正則 [a-zA-Z0-9]{6,16} 限定量詞。
3.2、順序否定環視(?!Expression)
3.2.1、匹配除<a></a>之外的標籤
【<(?!/?a\b)[^<]+?>】
文本:<a><a1></a>zxiaofan<div>com</d>iv>cc
匹配結果:
<a1>
<div>
</d>
3.2.2、匹配尾碼結尾不是“.txt”的含尾碼的檔案名稱
【.+(?!\.txt)】運算式錯誤,因為.+沒有指定位置且是貪婪匹配。(因此.+就能直接匹配txtfile.txt了)
【(.+)(?!\.txt)\.[^.]+$】
文本:
txtfile.txt
exefile.exe
inifile.ini
匹配結果:
exefile.exe
inifile.ini
3.3、逆序肯定環視(?<=Expression)
3.3.1、匹配指定標籤之間的內容
【(?<=<div>)[^<]+(?=</div>)】
文本:<div>zxiaofan.com</div>
匹配結果:zxiaofan.com
3.3.2、擷取指定參數的值
【(?<=name=).+】
文本:
name=zxiaofan
age=20
level=6
匹配結果:zxiaofan
3.4、逆序否定環視(?<!Expression)
3.4.1、擷取非指定參數的值
【^[^=#]+=(?<!name=).+$】
文本:
name=zxiaofan
age=20
level=6
#sex=1
匹配結果:
age=20
level=6
4、綜合樣本
4.1、必須包含字母、數字、特殊字元
【^(?=.*?[a-zA-Z])(?=.*?\d)(?![a-zA-Z\d]+$).+$】
解釋:^(?=.*?[a-zA-Z])限制必須有字母;(?=.*?\d)限制必須有數字;(?![a-zA-Z\d]+$)限制不能全為數字和字母。
4.2、匹配主網域名稱(匹配頂級網域名稱)
【(?<=(?:://\w{0,50}\.)?)(?:\w{0,50}\.)(?:com\.cn|net\.cn|org\.cn|com|net|org|cn|biz|info|cc|tv)】
文本:
vip.zxiaofan.com.cn
http://zxiaofan.com/123
www.zxiaofan.org.cn
匹配結果:
zxiaofan.com.cn
zxiaofan.com
zxiaofan.org.cn
Note:【?:】不捕獲匹配的文本到自動命名的組,也不給此組分配組好。(去掉後不影響結果)
特殊網域名稱:萬網www.net.cn
4.3、匹配5連號手機號碼
【1[34578]\d{3}(\d)(?!\1{1})(\d)\2{4}】
文本:
18328501111
18328511111
18328551111
18328111111
匹配結果:
18328511111
Note1:\1匹配第一組內容
Note2:(?!\1{1})過濾6連號的號碼
反向引用
1、反向引用概念
擷取的群組:按照()子運算式劃分成若干組;每出現一對()就是一個擷取的群組;引擎會對擷取的群組進行編號,編號規則是左括弧(從左至右出現的順序,從1開始編號。
擷取的群組命名:
(?<name>exp) 匹配exp,並捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp);
(?:exp) 匹配exp,不捕獲匹配的文本到自動命名的組,也不給此分組分配組號。
反向引用:
\1表示第一組(abc);\2表示第二組;
\k<Word>:引用指定名字的組。
2、使用樣本
2.1、匹配首尾相同的檔案名稱
【([a-z]{3})[a-z]+\.\1{1}】
文本:
txtfile.txt
exefile.txt
fileini.ini
匹配結果:
txtfile.txt
Note:([a-z]{3})為第一組,\1{1}表示引用第一組一次(這裡不能寫成\1{3})。
PS:這裡再為大家提供2款非常方便的Regex工具供大家參考使用:
JavaScriptRegex線上測試載入器:
http://tools.jb51.net/regex/javascript
Regex線上產生工具:
http://tools.jb51.net/regex/create_reg