正則表示式(Regex)
定義:是指一個用來描述或者匹配一系列符合某個語法規則字串的字串 ,其實就是一種規則。、
字元類: []代表單個字元
[abc] a 或b或c其中的某一個字元
[^abc] 任何字元 除了 a,b,c
[a-zA-Z] a到z或A到Z 兩頭的字母都包括在內
[a-d[m-p]] a到d 和m到p(並集)
[a-z&&[def] def (a-z這個範圍和def這個範圍的交集)
[a-z&&[^bc]] a到z 除了bc
[a-z&&[^m-p]] a到z 除了m-p
預定義字元類: \有轉義的意義 要多加一個\ eg:\\d
. 任何字元
\d 數字[0-9]
\D 非數字[^0-9]
\s 空白字元
\S 非空白字元
\w單詞字元 [a-zA-Z_0-9]
\W非單詞字元
數量詞:
X? X出現一次或一次也沒有
X * X出現零次或多次
X + X出現一次或多次
X{n} X出現n次
X{n,} X出現至少n次
X{n,m} X出現至少n次 但不超過m次
正則表示式的分割功能 (String類的方法)
public static [] split(String regex) 以指定正則表示式去分割字串 返回字串陣列
正則表示式的替換功能
public String replaceAll(String regex,String replacement) 引數分別是正則表示式和替換後的字元
正則表示式的分組功能
捕獲組可以通過從左到右計算其開括號來編號。例如,在表示式 ((A)(B(C))) 中,存在四個這樣的組:
1.((A)(B(C)))
2.\A
3.(B(C))
4.(C)
組零始終代表整個表示式。
練習
疊詞 快快樂樂 高高興興
String regex="(.)\\1(.)\\2"; \\1代表的是第一組(.)出現1次 \\2代表的是第二組(.)出現2次
疊詞 好啦好啦
String regex="(..)\\1";
按照疊詞切割字串
String word="sdqqfgkkjhppppkl";
String [] str=word.split("(.)\\1+");
需求 把字串“我.我.我...要...要...要.學學...編編....編.程...程” 還原成“我要學程式設計”
String word="我.我.我...要...要...要.學學...編編....編.程...程";
//先把.字元去掉
word=word.replaceAll("\\.+"," ");
//把重複的字元用組中的資料替換掉 $1代表的是組一的值
String newWord=word.replaceAll("(.)\\1+","$1");
Pattern類和Matcher類
典型的呼叫順序是
Pattern p = Pattern.compile
("a*b"); //獲取正則表示式 Matcher m = p.matcher
("aaaaab"); //根據正則表示式生成匹配器 boolean b = m.matches
();
獲取功能:
//練習 :獲取 字串包含的電話號碼
String word="我的電話號碼是13528669636 以前曾經用過 13728470633 和 13342607602";
String regex="1[3578]\\d{0}"; //電話號碼的正則表示式 第一位數字固定 1 第二位 從 3578中一位 後9位都是其他數字
Pattern p=Pattern.compile(regex); //獲取正則表示式
Matcher m=m.matcher(word); //根據正則表示式和要查詢的語句生成匹配器
while(m.find()) //匹配是否存在符合正則表示式的字串 有就返回true 沒有返回false
System.out.println(m.group()); //group()方法把匹配的字串輸出 每次匹配到都會從匹配到的後面開始搜尋
需要特別注意的是:必須先使用find()方法 ,如果在沒有嘗試任何匹配就使用group()方法就會報錯