一、概述
正則表達式通常被用來對字符串提供范圍性的校驗、替換那些符合某個模式(規則)的文本。
正則表達式所對應的類Pattern,所有的正則表達式都是在這個類下創建的。Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(String regex)簡單工廠方法創建一個正則表達式。
Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作。Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持。
完成使用方法如下:
String str = "abc"; //指定校驗格式 Pattern p = Pattern.compile("abc"); //將當前的規則和判斷字符串進行匹配 Matcher m = p.matcher(str); //進行判斷 boolean b = m.matches(); System.out.println(b);
二、正則表達式常用符號介紹
1、[ ] 表示匹配括號中的任意一個字符。比如:
[a - z ]:表示匹配任意一個小寫字母。
2、^字符:如果用在[ ]內表示非;如果^放在了整個表達式的開頭,表示強制以當前字符開頭。比如:
[^a-z]:表示除了小寫字母以外的字符;^[a-z]則表示以小寫字母開頭。
3、預定義符號:
- .:表示任意字符;
- \w:表示單詞字符 [a-zA-Z_0-9]
- \d:表示數字[0-9];
- \s:表示空白字符:[ \t\n\x0B\f\r];
- \D:表示非數字: [^0-9]
- \W:表示非單詞字符:[^\w]
- \S:表示非空白字符:[^\s]
示例如下:
public static void main(String[] args) { String str = "\\\\"; //1. 字符串是由3個字符組成:第一個字符只能從a/b/c,第二個字符只能由r/s/t // 第三個字符是數字 // [xyz] - 表示可以是x/y/z中的任何一個 // [a-b] - 按照碼表從a開始一直找到b //System.out.println(str.matches("[abc][rst][0-9]")); // 1.判斷一個字符串是否是由一個小寫字母組成 // System.out.println(str.matches("[a-z]")); // 2. [^abc]表示除了a/b/c // System.out.println(str.matches("[^a-zA-Z]")); //3. 字符串由三個組成,第一個是字母,第二個是數字, //“.”表示任意一個字符 //System.out.println(str.matches("[a-zA-Z][0-9].")); //4.判斷字符串是否只有一個字符 //System.out.println(str.matches(".")); //匹配. //\\. 經過java編譯就變成了\.,正則再轉義成. 表示. //System.out.println(str.matches("\\.")); //\\\\java編譯\\;\\正則編譯后\ // \\\\ -> \\ -> \ //System.out.println(str.matches("\\\\")); System.out.println(str.matches("\\w")); System.out.println(str); }
4、數量詞:
- +:表示1次到多次 {1,};
- *:表示0次多到次 {0,};
- ?:表示0次到一次 {0,1};
- {n}:表示有且只有n次;
- {n,}:表示n次及其以上;
- {n,m}表示n-m次之間。
示例如下:
public static void main(String[] args) { String str = "dasfd"; //1. {5}恰好由n次 System.out.println(str.matches("[a-zA-Z]{5}")); //2. 至少由5個字母組成的字符串 //System.out.println(str.matches("[a-zA-Z]{4}[a-zA-Z]+")); System.out.println(str.matches("[a-zA-Z]{5,}")); //3.由6-12個字符組成 System.out.println(str.matches(".{6,12}")); }
二、捕獲組
捕獲組的特征:
1、用()括起來的單元稱之為捕獲組;
2、在正則表達式中,會對捕獲組進行自動編號,編號從1開始。這與大多數的編號從0開始不同。
3、\n表示引用編號為n的捕獲組;
4、捕獲組的編號從(左括號的出現位置開始依次計數。
捕獲組往往用於疊字的判斷,示例如下:
//{2,} -- 至少兩個字符 //(.)\\1+ 表示疊字 String str1 = "娃哈哈"; System.out.println(str1.matches(".*(.)\\1+.*")); //AABB 高高興興 String str2 = "高高興興"; System.out.println(str2.matches(".*(.)\\1(.)\\2.*")); //abab 休息休息 (..)任意兩個字符 String str3 = "休息休息"; System.out.println(str3.matches("(..)\\1"));
三、正則表達式和String結合后的使用
使用Pattern和Matcher的方式匹配太過繁瑣,我們往往使用字符串直接匹配的方法進行判斷。
1、字符替換
將String字符串中的字符進行替換,返回一個新的字符,原字符串不變。例如:
String str = "asfsafasf12sad17--"; //將字符串替換為-- System.out.println(str.replaceAll("\\d", "-")); //將字符串中的所有的數字去掉;參數:正則表達式 System.out.println(str.replaceAll("\\d", "")); //所有非數字替換掉 System.out.println(str.replaceAll("\\D", "")); String sub = str.replaceAll("\\D", "");
2、對字符串進行切割
以某字符或數字作為切割符將字符串進行切割成多個子串,返回一個子串數組。例如:
//切割 String str = "40asfas40as1fasdcer4"; //以數字為切割符將字符串切割成多個子串 //作為切割符的字符會被整個切掉 //如果切割符在字符串的尾部,會被直接切掉 String[] arr = str.split("\\d"); System.out.println(arr.length); for(String s : arr) { System.out.println(s); }
3、使用$引用上一個捕獲組,對字符串進行去重和顛倒
將字符串中的多個連續的字符去掉,或者將單詞進行顛倒。比如:
String str = "Cat Dog"; //將cat和dog的位置進行顛倒 //在替換過程中,\n的形式不起作用 //在替換過程中,如果想要引用上一個捕獲組,那么需要使用$n的形式 System.out.println(str.replaceAll("(Cat)(.*)(Dog)", "$3$2$1")); String str1 = "我我我我愛愛學學學學習習"; System.out.println(str1.replaceAll("(.)\\1+", "$1"));