//漢字範圍u4E00-u9FA5
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/***********************
* create by fzw 本人網站:www.itstack.org
* 2013年11月19日
* 正則的使用
************************/
public class sxtRegex01 {
public static void main(String[] args) {
p("檢查是否匹配:"+"abc".matches("..."));
p("替換字符串:"+"abc123aa".replaceAll("\\d", "."));
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("fgha");
p("Pattern+Matcher方法驗證匹配:"+m.matches());
p("------------------");
p("a".matches("[abc]"));
p("a".matches("[^abc]"));
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z(A-Z)]"));
p("R".matches("[A-Z&&(RFG)]"));
p("------------------");
p("a_8".matches("\\w{3}"));
p("\\".matches("\\\\"));
p("------------------");
p("hello sir".matches("h.*"));
p("hello sir".matches(".*ir$"));
p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//匹配單詞邊界,單詞邊界是空格出現的位置用\\b匹配
p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));//開頭是一個空格,且不能是換行符,最後必須是換行
p("------------------");
Pattern p2 = Pattern.compile("\\d{3,5}");
String s = "123-4536-89789-000";
Matcher m2 = p2.matcher(s);
p(m2.matches());
m2.reset();//把吃進去的字符吐出來重新匹配,否經過m2.matches會吃進去字符 下面的匹配就不成功
p(m2.find());
p(m2.start()+"-"+m2.end());//找到了 就把首位位置打印下(必須找到才能打印)
p(m2.find());
p(m2.start()+"-"+m2.end());
p(m2.find());
p(m2.start()+"-"+m2.end());
p(m2.find());
p(m2.lookingAt());//每次都是才頭上開始找
p("------------------");
Pattern p3 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加屬性後,Patter.CASE_INSENSITIVE表示大小寫不管
Matcher m3 = p3.matcher("java_Java_jAva_jAVa_IloveJava");
p(m3.replaceAll("JAVA"));//把所有的都替換爲大寫的
p("------------------按照單雙數替換");
Pattern p4 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加屬性後,Patter.CASE_INSENSITIVE表示大小寫不管
Matcher m4 = p4.matcher("java_Java_jAva_jAVa_IloveJava fdasfas");
StringBuffer sb = new StringBuffer();
int i = 0;
while(m4.find()){
i ++;
if(i%2 == 0){
m4.appendReplacement(sb, "java");
}else{
m4.appendReplacement(sb, "JAVA");
}
}
m4.appendTail(sb);//把尾巴在再添加到buf上既是sb
p(sb);
p("------------------分組加括號只取數字一組");
Pattern p5 = Pattern.compile("(\\d{3,5})([a-z]{2})");
Matcher m5 = p5.matcher("123bb_78987dd_090po");
while(m5.find()){
p(m5.group(1));//grop括號裏面第0組是整體,第一組是左起第一個括號,第二組是左起第二個括號
}
p("------------------貪婪的匹配與不貪婪匹配");
Pattern p6 = Pattern.compile("(.{3,10}?)[0-9]");//.{3,10}後面沒問號就是貪婪匹配會陪到最長,如果{3,10}?加?號就是懶蛋匹配之匹配最少的,從3個開始找
Matcher m6 = p6.matcher("aaaa5dddd8");
while(m6.find()){//如果這裏用if(m6.find)(){p(m6.start()+"-"+m6.end());} 那麼之匹配第一個
p(m6.start()+"-"+m6.end());
}
p("------------------普通捕獲");
Pattern p7 = Pattern.compile(".{3}");
Matcher m7 = p7.matcher("ab4dd5");
while(m7.find()){
p(m7.group());
}
p("------------------非捕獲組");
Pattern p8 = Pattern.compile(".{3}(?=a)");//(?=a)這個是非捕獲組的意思,最後一個是a而且還不把這個a取出來!!(?=a)這個要是寫在前面 就不一樣了
Matcher m8 = p8.matcher("ab4add5");
while(m8.find()){
p("後面不能是a的"+m8.group());
}
p8 = Pattern.compile("(?!a).{3}");//(?!a)前面不能是a的
m8 = p8.matcher("abbsab89");
while(m8.find()){
p("前面不能是a的"+m8.group());
}
//(?<!a)從後往前數 不是a的
//(?<=a)從後往前數 是a的
p("------------------去除><號匹配");
Pattern p9 = Pattern.compile("(?!>).+(?=<)");
Matcher m9 = p9.matcher(">編程中國<");
while(m9.find()){
p(m9.group());
}
p("------------------向前引用");
Pattern p10 = Pattern.compile("(\\d\\d)\\1");//這裏面的1是向前引用,12是第一匹配到的,下一次在匹配出來12和前面相同 所以是true
Matcher m10 = p10.matcher("1212");
p(m10.matches());
p("------------------忽略大小寫,正則內嵌");//(?i)非捕獲組裏面這個表示忽略大小寫
p("java".matches("(?i)JAVA"));
}
public static void p(Object o){
System.out.println(o);
}
}
--- 正則常用符
字符
x 字符 x
\\ 反斜線字符
\0n 帶有八進制值 0 的字符 n (0 <= n <= 7)
\0nn 帶有八進制值 0 的字符 nn (0 <= n <= 7)
\0mnn 帶有八進制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 帶有十六進制值 0x 的字符 hh
\uhhhh 帶有十六進制值 0x 的字符 hhhh
\t 製表符 ('\u0009')
\n 新行(換行)符 ('\u000A')
\r 回車符 ('\u000D')
\f 換頁符 ('\u000C')
\a 報警 (bell) 符 ('\u0007')
\e 轉義符 ('\u001B')
\cx 對應於 x 的控制符
字符類
[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]] d、e 或 f(交集)
[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 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
POSIX 字符類(僅 US-ASCII)
\p{Lower} 小寫字母字符:[a-z]
\p{Upper} 大寫字母字符:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十進制數字:[0-9]
\p{Alnum} 字母數字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 標點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可見字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或製表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六進制數字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r]
java.lang.Character 類(簡單的 java 字符類型)
\p{javaLowerCase} 等效於 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效於 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效於 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效於 java.lang.Character.isMirrored()
Unicode 塊和類別的類
\p{InGreek} Greek 塊(簡單塊)中的字符
\p{Lu} 大寫字母(簡單類別)
\p{Sc} 貨幣符號
\P{InGreek} 所有字符,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大寫字母除外(減去)
邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次
Reluctant 數量詞
X?? X,一次或一次也沒有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超過 m 次
Possessive 數量詞
X?+ X,一次或一次也沒有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超過 m 次
Logical 運算符
XY X 後跟 Y
X|Y X 或 Y
(X) X,作爲捕獲組
Back 引用
\n 任何匹配的 nth 捕獲組
引用
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到 \E
\E Nothing,但是結束從 \Q 開始的引用
特殊構造(非捕獲)
(?:X) X,作爲非捕獲組
(?idmsux-idmsux) Nothing,但是將匹配標誌i d m s u x on - off
(?idmsux-idmsux:X) X,作爲帶有給定標誌 i d m s u x on - off
的非捕獲組 (?=X) X,通過零寬度的正 lookahead
(?!X) X,通過零寬度的負 lookahead
(?<=X) X,通過零寬度的正 lookbehind
(?<!X) X,通過零寬度的負 lookbehind
(?>X) X,作爲獨立的非捕獲組