規則表示式的使用
可以參考 java.util.regex.Pattern
1、字面意義字符
字母或數字 比較字母或數字
\\ 比較\
\0n 八進制0n字符(0<= n>= 7 )
\0n 八進制0nn字符(0<= n>= 7 )
\0mnn 八進制0mnn字符(0<= n>= 7, 0<= m <=3 )
\xhh 十六進制0xhh字符
\uhhhh 十六進制0xhhh字符
\x{h...h} 十六進制0xh...h字符
\t Tab(\u0009)
\n 換行(\u000A)
\r 返回(\u000D)
\f 換頁(\u000C)
\a 響鈴(\u0007)
\e ESC(\u001B)
\cx 控制字符x
一些特殊符號
! $ ^ * ( ) + = { } [ ] | \ : . ? 等
2、字符類
[abc] a或b或c任一字符
[^abc] a、b、c以外的任意字符
[a-zA-Z] a到z或A~Z任一字符
[a-d[m-p]] a到d或m~p任一字符,等於[a-dm-p]
[a-z&&[def]] a到z而且是d、e、f的任一字符,等於[def]
[a-z&&[^bc]] a到z而且不是b或c的任一字符,等於[ad-z]
[a-z&&[^m-p]] a到z而且不是m到p的任一字符,等於[a-lq-z]
預定義字符
. 任一字符
\d 比較任一數字,即[0-9]
\D 比較任一非數字字符,即[^0-9]
\s 比較任一空格字符,即[\t\n\x0B\f\r]
\S 比較任一非空格字符,即[^\s]
\w 比較任一ASCLL字符,即[a-zA-Z0-9]
\W 比較任一非ASCLL字符,即[^\w]
3、貪婪、逐步、獨吞量詞
貪婪量詞
X? X項目出現一次或沒有
X* X項目出現零次或多次
X+ X項目出現一次或多次
X{n} X項目出現n次
X{n,} X項目至少出現n次
X{n,m} X項目出現n次但不超過m次
貪婪量詞:當比較器看到貪婪量詞的時候,比較量詞會把剩餘的文字整個吃掉,再逐步吐出文字,
看看是否符合量詞後的規則表達式。如果吐出部分符合,而能吃下部分也符合貪婪
量詞就比較成功,結果就是貪婪量詞會儘可能的找出長度最長的符合文字。
逐步量詞:在貪婪量詞表示法後面加上?,就成爲了逐步量詞,比較器看到逐步量詞時,會一邊
吃掉剩餘的文字,一邊看看吃下的文字是否符合規則表達式。
獨吞量詞:在貪婪量詞後面加上+,就成爲了獨吞量詞,比較器看到獨吞量詞時,會先將剩餘的文
字吃掉,然後看看獨吞量詞部分是否符合吃下的文字,如果符合就不會再吐出來了。
以xfooxxxxxxfoo爲例
規則表示式 符合的結果
.* xfooxxxxxxfoo
.*? xfoo和xxxxxxfoo
.*+ 無
4、邊界比較(\b標註邊界)
如:\bdog\b 則以dog這個單詞爲分割
常用的一些比較
^ 一行開頭
$ 一行結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入開頭
\G 前一個符合項目結尾
\Z 非最後終端機的輸入結尾
\z 輸入結尾
5、分組與參考
例如郵箱: ^[a-zA-Z]+\d*@([a-zA-Z0-9]+\.)+com
回頭參考:規則表達式 ((A)(B(C)))有四個分組(按左括號的個數來分)
1、( (A) ( B (C) ) )
2、(A)
3、(B ( C) )
4、(C)
例:\d\d要比較兩個數字,(\d\d)\1則是要比較四個數字,1212會符合,而1234則不符合.
例:["'][^"']*["']兩邊的部分爲單引號或雙引號,但並沒有說如果前面的是單引號後面的就必須是
單引號 。
(["']) ["']*\1則兩邊的符號必須一致
另外比較重要的兩個實例
java.util.regex.Pattern
java.util.regex.Matcher
例子:
package useGuiZeBiaoDaShi;
public class useGuiZeBiaoDaShi {
static String[] token = null;
static String strings;
public static void main(String [] args){
//根據逗號切割
useGuiZeBiaoDaShi u = new useGuiZeBiaoDaShi();
strings = "Sun,Fei,Long";
System.out.println("根據逗號分隔"+strings);
token = strings.split(",");
u.outPut(token);
//根據Tab分割
strings = "Sun\tFei\tLong";
System.out.println("根據\\t分隔"+strings);
token = strings.split("\\t");
u.outPut(token);
//根據+分割
strings = "Sun+Fei+Long";
System.out.println("根據+分隔"+strings);
token = strings.split("\\+");
u.outPut(token);
//根據||分割
strings = "Sun||Fei||Long";
System.out.println("根據||分隔"+strings);
token = strings.split("\\|\\|");
u.outPut(token);
//根據\分割
strings = "Sun\\Fei\\Long";
System.out.println("根據\\分隔"+strings);
token = strings.split("\\\\");
u.outPut(token);
//測試字符類
//格局ab分割
strings = "SunabFeiabLong";
System.out.println("根據ab分隔"+strings);
token = strings.split("[a][b]");
u.outPut(token);
//根據漢字分割,可以用來驗證字符串是否包含漢字
strings = "Sun孫Fei飛Long";
System.out.println("根據漢字分隔"+strings);
token = strings.split("\\W");
System.out.println(token.length);
if(token.length > 1){
System.out.println("包含漢字");
}
u.outPut(token);
//貪婪,逐步,獨吞量詞
String [] regexs = {".*foo",".*?foo",".*+foo"};
for(String regex: regexs){
System.out.println("xfooxxxxxxfoo".replaceAll(regex, "Orz"));
}
//日期的格式驗證
//---/d/d/d/d-/d/d/d/d/d/d
String date = "1111-111111";
System.out.println("根據/d/d/d/d-/d/d/d/d/d/d分割"+date);
token = date.split("\\d{4}-\\d{6}");
System.out.println(token.length);
if(token.length != 0){
u.outPut(token);
}
else{
System.out.println("符合格式!");
}
}//end main
//輸出分割後的字符
public void outPut(String [] token){
for(String s: token){
System.out.println(s);
}
}//end ourPut
}