天天看點

正規表達式 學習筆記4.2

單詞分界符注意事項:

l \b 表示單詞分界符,要求一側是單詞字元,另一側是非單詞字元

l 單詞字元通常指的是英文字元、數字字元,對中文不适用

l 非單詞字元通常指的是各種标點符号和空白字元

例子:

public class GeneralThree {

public static void main(String[] args) {

String[] strings = {"This sentence contains word cat",

"This sentence contains word 'cat'",

"This sentence contains word vacation",

"This sentence contains word \"cate\"",

"句子裡包含的英文單詞cat0在這裡",

"句子裡包含的英文單詞cat在這裡"

};

String regex = "\\bcat\\b";

for(String str:strings){

System.out.println("處理句子:"+str);

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);

if(m.find()){

System.out.println("找到 cat !");

}else{

System.out.println("沒有找到 cat !");

}

運作結果:

處理句子:This sentence contains word cat

找到 cat !

處理句子:This sentence contains word 'cat'

處理句子:This sentence contains word vacation

沒有找到 cat !

處理句子:This sentence contains word "cate"

處理句子:句子裡包含的英文單詞cat0在這裡

處理句子:句子裡包含的英文單詞cat在這裡

可見:

第三個、\b不能區分t0英文字元和數字字元之間的位置。

第四個、\b不能區分t在英文字元和中文字元之間的位置。

錨點:

l ^ 比對一行的開頭(有可能變化)

l $ 比對一行的結尾(有可能變化)

l \A 比對整個字元串的開頭

l \Z 比對整個字元串的末尾

^和$在不同的比對模式下,可能有所變化,比對模式的概念将在下一節課介紹。

預設情況下:

^等于\A 用來比對整個字元串的開頭

$等于\Z 用來比對整個字元串的結尾

如果比對某一個邏輯行的開頭,和某一個邏輯行的結尾?

這個需要更改比對模式。

看看這四個錨點的基本應用。

public class GeneralFour {

String[] strings = {"start"," start "," end ","end"};

String[] regexs = {"^start","\\Astart","end$","end\\Z"};

for(String regex:regexs){

System.out.println(str+"能夠比對正則:"+regex);

System.out.println(str+"不能夠比對正則:"+regex);

處理句子:start

start能夠比對正則:^start

start能夠比對正則:\Astart

start不能夠比對正則:end$

start不能夠比對正則:end\Z

處理句子: start 

 start 不能夠比對正則:^start

 start 不能夠比對正則:\Astart

 start 不能夠比對正則:end$

 start 不能夠比對正則:end\Z

處理句子: end 

 end 不能夠比對正則:^start

 end 不能夠比對正則:\Astart

 end 不能夠比對正則:end$

 end 不能夠比對正則:end\Z

處理句子:end

end不能夠比對正則:^start

end不能夠比對正則:\Astart

end能夠比對正則:end$

end能夠比對正則:end\Z

下面一個功能:

環視

l 錨點對位置的判斷不夠靈活

l 作用:應用子表達式對位置進行判斷

l 形式:

· (?=...)

· (?!...)

· (?<...)

· (?<!...)

形式

名稱

比對意義

(?=...)

肯定順序環視

右側文本能由子表達式比對

(?!...)

否定順序環視

右側文本不能由子表達式比對

(?<...)

肯定逆序環視

左側文本能由子表達式比對

(?<!...)

否定逆序環視

左側文本不能由子表達式比對

首先看看順序環視結構的例子:

public class GeneralFive {

String[] strings = new String[]{"Jeff","Jeffrey","Jefferson"};     

String[] regexs = new String[]{"Jeff","Jeff(?=rey)","Jeff(?!rey)"};

System.out.println("\"" + str +"\" 能夠比對正則:"+regex);

System.out.println("\"" + str +"\" 不能夠比對正則:"+regex);

System.out.println("");

"Jeff" 能夠比對正則:Jeff

"Jeffrey" 能夠比對正則:Jeff

"Jefferson" 能夠比對正則:Jeff

"Jeff" 不能夠比對正則:Jeff(?=rey)

"Jeffrey" 能夠比對正則:Jeff(?=rey)

"Jefferson" 不能夠比對正則:Jeff(?=rey)

"Jeff" 能夠比對正則:Jeff(?!rey)

"Jeffrey" 不能夠比對正則:Jeff(?!rey)

"Jefferson" 能夠比對正則:Jeff(?!rey)

未完待續。。。

本文轉自jooben 51CTO部落格,原文連結:http://blog.51cto.com/jooben/318584

繼續閱讀