下面看看逆序環視結構:
public?class?GeneralSix?{
public?static?void?main(String[]?args)?{
String[]?strings?=?new?String[]{"see","bee","tee"};?????
String[]?regexs?=?new?String[]{"(?<=s)ee","(?<!s)ee"};
for(String?regex:regexs){
for(String?str:strings){
Pattern?p?=?Pattern.compile(regex);
Matcher?m?=?p.matcher(str);
if(m.find()){
System.out.println("\""?+?str?+"\"?能夠匹配正則:"+regex);
}else{
System.out.println("\""?+?str?+"\"?不能夠匹配正則:"+regex);
}
}
System.out.println("");
}
}
}
運行結果:
"see"?能夠匹配正則:(?<=s)ee
"bee"?不能夠匹配正則:(?<=s)ee
"tee"?不能夠匹配正則:(?<=s)ee
"see"?不能夠匹配正則:(?<!s)ee
"bee"?能夠匹配正則:(?<!s)ee
"tee"?能夠匹配正則:(?<!s)ee
(?<=s)ee
肯定逆序環視結構,用來查找前面為s的ee。
(?<!s)ee
否定逆序環視結構,用來查找之前不為s的ee
環視的注意事項:
l?環式結構僅用于布爾判斷,結構內的子表達式所匹配的文本,不會保存在整個表達式的匹配結果中
l?逆序環視結構對子表達式存在限制
逆序環視結構的限制
l?Perl,Python:逆序環視結構中的子表達式必須為固定長度
就是不能使用任何量詞,也不能使用多選分支,長度不相同的多選結構
l?PHP,Java:逆序環視結構中的子表達式可以不定長度,但必須由上限
就是不能使用?*、+?這樣的量詞。
l?.NET:逆序環視結構中的子表達式完全沒有限制
從這個意義上說,.NET的正則表達式是做的最好的。
環視應用實例:
l?修整數值
l?要求:在數值中的合適位置插入逗號,將其修整為便于閱讀的形式
l?舉例:
·1234567890->1,234,567,890
·123456->123,456
環視應用實例:
l?需要插入逗號的位置:
·左側至少出現一位數字,右側出現的數字位數是3的倍數
l?正則表達式:
·(?=\d)(?=(\d{3}+))
public?class?GeneralSeven?{
public?static?void?main(String[]?args)?{
String[]?numbers?=?new?String[]{"123456","1234567890"};?????
String?regex?=?"(?<=\\d)(?=(\\d{3})+)";
for(String?number:numbers){
System.out.println("替換前:"+number);
System.out.println("替換后:"+number.replaceAll(regex,?","));
}
}
}
運行結果:
替換前:123456
替換后:1,2,3,456
替換前:1234567890
替換后:1,2,3,4,5,6,7,890
這個結果有問題,123456應該顯示為,123,456
1234567890?應該為:1,234,567,890
問題出在:
?"(?<=\\d)(?=(\\d{3})+)";
右邊出現的是3的倍數,對這個字符串長度,就是匹配到哪個為止,我們并沒有限定。
對肯定順序環結構對字符串的匹配加以更準確的限制。
應該再添加一個否定循環結構:
String?regex?=?"(?<=\\d)(?=(\\d{3})+(?!\\d))";
替換前:123456
替換后:123,456
替換前:1234567890
替換后:1,234,567,890
小結:
l?錨點:規定匹配的位置
·?\b、^、$、\A、\Z
l?環視:以子表達式對位置進行判斷
·(?=)、(?!)
·(?<)、(?<!)
·環視只能進行布爾判斷
·逆序環視的限制
正則表達式 學習筆記4 完! 本文轉自jooben 51CTO博客,原文鏈接:http://blog.51cto.com/jooben/318587