原創|其它|編輯:郝浩|2009-09-29 14:11:58.000|閱讀 871 次
概述:正則表達式的規則中,'\'作為一個轉義字符出現。由于在正則表達中,許多字符已經被作為正則表達式的關鍵字而被賦予了特殊的含義從而失去了它們本身的含義。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
正則表達式的規則中,'\'作為一個轉義字符出現。由于在正則表達中,許多字符已經被作為正則表達式的關鍵字而被賦予了特殊的含義從而失去了它們本身的含義。例如'*'在正則表達式中表示匹配'*'前面的子表達式零次或多次,假如想匹配一個正常的'*'字符,就要使用'\*'來表示。而在Java源代碼的字符串中,'\'首先被被Java字節碼編譯器解釋java語言中定義的Unicode轉義或其他字符轉義,所以想在java源代碼中表示正則表達式中一個正常的'*'字符,需要加兩個'\',即'\\*',表示把第二個'\'轉成java源代碼中一個正常的字符,而這個正常的字符則在這段java源碼中的正則表達式中表示正則表達式中的轉義字符。
如果要表示java源碼中的正則表達式的一個正常的'\'字符,則需要這樣表示'\\\\',其中第一第三個'\'均表示java編譯器中的轉義字符第二個則表示正則表達式中的轉義字符,從而把第四個'\'轉義為正則表達式中一個普通的'\'字符。
一、匹配判斷與查找在java中,匹配判斷操作常用的類有兩個:java.util.regex.Pattern,java.util.regex.Matcher。 Pattern是字符串形式的正則表達式的編譯類,指定為字符串的正則表達式必須首先被編譯為它的實例。Matcher被定義為"通過解釋 Pattern 對字符序列執行匹配操作的引擎"。通俗一些說,一個字符形式的正則表達式編譯成為一個Pattern的實例,相當于掃雷中的一個掃雷器,而Pattern的實例的matcher方法(參數相當于某一個地點)則相當于拿這個掃雷器的人,當執行Matcher的實例方法matches()后,此方法返回一個表示是否匹配的boolean值,而這個操作就相當于這個人把這個掃雷器放到這個地點后,這個人看到掃雷器上面的指示,就會得出這個地方是否有雷的信息。假如我們想判斷一個文件名中是否包含.class這個后綴名,由于.class后綴名有時候會有大小寫的不同形式,那么可以使用以下方式判斷:
1、首先構造正則表達式
//此正則表達式表示,在.class中的.號前面緊挨著的字符不能是空字符,必須是其它字符,或者是.class后面不再有其它字符,或者是","或空字符,或二者之后再跟其它字符串,"."表示匹配任意字符,[^]表示除緊跟在它之后字符的其它任意字符,+表示匹配至少1次,*表示匹配至少0次,{0,1}表示匹配0或1次,[cC]表示匹配大寫或小寫c等價于[c|],"|"表示或的運算,()內表示一個完整的字符串表達式:
String regex = ".*[^ ]+\\.[cC][lL][aA][sS][sS]([,| ].*){0,1}";
Pattern p = Pattern.compile( regex );
Matcher m = p.matcher( " file1.class,test.txt" ) boolean b = m.matches();
這個正則表達式可以匹配" xx.class,"或"xx.class "或"xx.class"或"xx.clss,xxx"或"xx.class xxx"等諸多形式字符串。
另外一對有用的定位符是"^"和"$",在和"+"和"*"等這些限定符結合使用時,可以匹配某些特殊的字符串,如每章的章節//B表示一行的中間位置,^表示行的開頭,$表示行的結尾String regex = "^ *第//www.cnblogs.com/gardenforu/admin/file://b[1-9]%7b1%7d//d*章 +[^ ]+.*[^ ]* *$"; Pattern p = Pattern.compile( regex ); Matcher m = p.matcher( " 第1章 南 昌 起 義 " ); boolean b = m.matches();這個表達式可以匹配" 第1章 南昌起義 "或"第1章 南昌起義"等樣式的章節名,它的限制有,行的開頭除空格外只允許出現"第"字,并且"第"字給緊跟一個非0的整數,數字后面則必須緊跟"章"字,并且"第x章"后面緊跟一個或多個空格,然后空格后必須有非空的章節名。章節名中間以及章節名后至行結尾允許有空字符,但章節名必須包含至少一個非空字符,其它的占位符及限定符用法請參考相關文檔。
另外,Pattern預定義了一些常量表示常用的匹配模式,如CASE_INSENSITIVE表示匹配時不區分大小寫,可使用另一個compile方法: String regex = "//www.cnblogs.com/gardenforu/admin/file://.class/"; Pattern p = Pattern.compile( regex, Pattern.CASE_INSENSITIVE ); Matcher m = p.matcher( ".Class" ); boolean b = m.matches();//b的值為true
類Pattern的實例一旦編譯,就不能再改變,是線程安全的,所以可以用在并發操作中。對于只使用一次的模式,可以考慮使用Pattern的靜態方法matches( String regex, CharSequence input ),在僅使用一次正則表達式時,可以方便地通過此類定義matches方法。此方法編譯表達式并在單個調用中將輸入序列與其匹配。語句boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三個語句,但是對于重復的匹配而言它效率不高,因為它不允許重用已編譯的模式。
還有一種匹配判斷的驗證方法,就是使用String的matches(String regex)方法。 String s = ".Class"; boolean = s.matches(//www.cnblogs.com/gardenforu/admin/file://.[cc][ll][aa][ss][ss/])
2、String對象中的字符串替換與分割在String的方法中,有兩個替換方法和兩個分割方法可以使用正則表達式
這幾個方法在使用正則表達式時,對于正則表達式的構造方法是一樣的,如給定模式"//www.cnblogs.com/gardenforu/admin/file://.[cc][ll][ss][ss/]",替換字符串為.class,前三個方法依次這樣執行:替換給定字符串中所有含有不區分大小寫的.class字母,替換第一個,以不區分大小寫的.class分割字符串。
split(String regex, int limit)這個方法在使用的時候有點特別,因為多了一個匹配次數的限制參數。
文檔解釋如下
limit參數控制模式應用的次數,因此影響結果數組的長度。如果該限制n大于0,則模式將被最多應用n-1次,數組的長度將不會大于n,而且數組的最后項將包含超出最后匹配的定界符的所有輸入。如果n為非正,則模式將被應用盡可能多的次數,而且數組可以是任意長度。如果n為零,則模式將被應用盡可能多的次數,數組可有任何長度,并且結尾空字符串將被丟棄。
例如
"TestaTestATestaTest".split("a|A",2);
//則分割出來的字符串為Test,TestATestaTest "TestaTestATestaTest".split("a|A",3);
//則分割出來的字符串為Test,Test,TestaTest
另外,這個方法同Pattern的split方法的效果一樣Pattern.compile( "a|A" ).split( "TestaTestATestaTest", 2 );
有時候,匹配某些文本編輯器或數據庫中的文本內容中的換行符需要使用\n|\r\n
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:IT專家網