大過年的,加上室內溫度高(我都穿短袖了,在自己的小屋裡甚至要光膀子),煩躁,感覺學習效率有點低,今天就看了Regex。
書上例4:
假設姓名包括25個字母中的大部分,第一個字母大寫。姓的模式可以描述為
[A-Z][a-zA-Z][1,24]
感覺很怪,一是[a-zA-Z]的用法在常用Regex列表中沒看到(但是確實能用);
另外一點呢,應該是排版錯誤吧,怎麼是25個字母?而且後邊那個[1,24]應該是末尾的數十一道24裡的一個吧,正解貌似應該是{1,24},經手動測試,這是長度限制。
費解啊,沒參照,不知書上印錯了還是我沒懂。
還有一句,標識符的模式可以描述為[a-zA-Z_$][//w$],書上介紹的不多,貌似是並列關係,例如[a-zA-Z_$]就是字母或者_或者$。
另Java標識符在2.3節中定義:不能以數字開頭,應該只是規則而已,寫[1-9][a-z][/d]這種其實也能寫出來,所以是把標識符模式描述為...
前邊沒仔細看,發現一小規律,好記多了,//d數字,//D非數字。。。。。//w詞的一個字元,//W非詞的一個字元。。//s一個空白字元,//S一個非空白字元,大小寫是互補的
課後複習題:
有幾個看不懂,主要就是那些* +?那些
package Review_08;
public class Review_8_22 {
public static void main(String[] args){
System.out.println("Java".replaceAll("[av]","RX"));//a和v都匹配a and v
System.out.println("Java".replaceAll("av","RX"));
System.out.println("Java".replaceAll("[a][v]","RX"));//看不懂的
System.out.println("Java".replaceFirst("//w*","RX"));//第1個看不懂的
System.out.println("Java".replaceAll("//w*","RX"));//第2個看不懂的
System.out.println("Java".replaceAll("//w+","RX"));//第3個看不懂的
System.out.println("Java".replaceAll("//w+?","RX"));//第4個看不懂的
System.out.println("Java".replaceFirst("//w+?","RX"));//第5個看不懂的
}
}
粘點資料
貪婪與懶惰
當Regex中包含能接受重複的限定符時,通常的行為是(在使整個運算式能得到匹配的前提下)匹配儘可能多的字元。以這個運算式為例:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。
有時,我們更需要懶惰匹配,也就是匹配儘可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上一個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:
a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元)和ab(第四到第五個字元)。
表5.懶惰限定符
| 代碼/文法 |
說明 |
| *? |
重複任意次,但儘可能少重複 |
| +? |
重複1次或更多次,但儘可能少重複 |
| ?? |
重複0次或1次,但儘可能少重複 |
| {n,m}? |
重複n到m次,但儘可能少重複 |
| {n,}? |
重複n次以上,但儘可能少重複 |
為什麼第一個匹配是aab(第一到第三個字元)而不是ab(第二到第三個字元)?簡單地說,因為Regex有另一條規則,比懶惰/貪婪規則的優先順序更高:最先開始的匹配擁有最高的優先權——The match that begins earliest wins。