【java】正規表示式

love_Aym發表於2018-04-05

一、正規表示式

  • 是指一個用來描述或者匹配一系列符合某個語法規則的字串的單個字串。其實就是一種規則。有自己特殊的應用。
  • 作用:比如註冊郵箱,郵箱有使用者名稱和密碼,一般會對其限制長度,這個限制長度的事情就是正規表示式做的
  • 正規表示式也是一個字串
  • String類有個方法matches()方法,是專門用於檢驗字串是否符合正規表示式的規則
String regex = "[1-9]\\d{4,14}";
System.out.println("565899885956".matches(regex));


二、字元類演示

1、字元類

  • []:表示單個字元
  • [abc] a、b 或 c(簡單類):包含中括號裡的任一字元
  •  [^abc] 任何字元,除了 a、b 或 c(否定):不包含中括號裡的任一字元
  •  [a-zA-Z] a到 z 或 A到 Z,兩頭的字母包括在內(範圍):包含a到z或A-Z的任一字元(並集)
  • [a-d[m-p]]  a到d或者m-p(並集),相當於[a-dm-p]
  • [a-z&&[def]]  a-z和d,e,f 取交集
  • [a-z&&[^def]]  a-z和除了d,e,f 的取交集(減去)
  • [a-z&&[^m-p]]  a-z和除了m-p的取交集(減去)
  •  [0-9] 0到9的字元都包括:

注意:[]表示的單個字元,若字串中有多個字元,則flase。


2、預定義字元類

  •  . 任何字元(注意:單個字元。.. 代表任意兩個字元
  •  \d 數字:也就是[0-9],代表單個的數字字元

注意:\代表轉義字元,如果想表示\d的話,需要\\d

  •  \D 非數字:也就是[^0-9],除了0-9
  • \s 空白字元:[ \t\n\x0B\f\r]:\t為tab鍵,\n為換行,\x0B為DOS中的垂直製表符,\f為DOS中的翻頁,\r為回車;
  • \S 非空白字元:
  • \w 單詞字元:[a-zA-Z_0-9]

3、Greedy 數量詞

  •  X? :X代表任意字元,?代表一次或一次也沒有  
String regex1 = "[abc]?";
System.out.println( "a".matches(regex1));

  • X* :X代表任意字元,*代表零次或多次
  • X+ :X代表任意字元,+代表一次或多次
  • X{n}: X代表任意字元,{n}代表恰好 n 次
  • X{n,} :X代表任意字元,{n,}至少 n 次
  • X{n,m}: X代表任意字元,{n,m}代表至少 n 次,但是不超過m 次

三、正規表示式的分割功能

String類的分割功能:public String[] split(Stringregex):根據給定正規表示式的匹配拆分此字串,返回一個字串陣列

public class Demo5_Split {
	public static void main(String[] args) {
		String s = "金三胖.郭美美.李dayone";
		String[] arr = s.split("\\.");  //通過正規表示式切割字串,空格即為空格,但是點需要進行轉義,單獨點代表任意字元,會把字串切碎。
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}		
	}
}


四、正規表示式的替換功能

 * String類的功能:publicString replaceAll(String regex,String replacement),根據指定的替換字串來替換正規表示式裡的字元,返回一個新的字串。


五、正規表示式的分組功能

 * 捕獲組可以通過從左到右計算其開括號來編號。例如,在表示式 ((A)(B(C))) 中,存在四個這樣的組:

*

        1     ((A)(B(C)))

        2     (A

        3     (B(C))

        4     (C)

   

public class Demo7_Regex {

	/**
	 * * A:正規表示式的分組功能
			* 捕獲組可以通過從左到右計算其開括號來編號。例如,在表示式 ((A)(B(C))) 中,存在四個這樣的組: 
		* 
				1     ((A)(B(C))) 
				2     (A 
				3     (B(C)) 
				4     (C) 
			
				組零始終代表整個表示式。
	 */
	public static void main(String[] args) {
		//demo1();
		//demo2();
		
		/*
		 * 需求:我我....我...我.要...要要...要學....學學..學.編..編編.編.程.程.程..程
				將字串還原成:“我要學程式設計”。
		 */
		String s = "我我....我...我.要...要要...要學....學學..學.編..編編.編.程.程.程..程";
		String s2 = s.replaceAll("\\.+", "");
		String s3 = s2.replaceAll("(.)\\1+", "$1");	//$1代表第一組中的內容
		System.out.println(s3);
	}

	public static void demo2() {
		//需求:請按照疊詞切割: "sdqqfgkkkhjppppkl";
		String s = "sdqqfgkkkhjppppkl";
		String regex = "(.)\\1+";					//+代表第一組出現一次到多次
		String[] arr = s.split(regex);
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

	public static void demo1() {
		//疊詞 快快樂樂,高高興興
		/*String regex = "(.)\\1(.)\\2";		//\\1代表第一組又出現一次	\\2代表第二組又出現一次
		System.out.println("快快樂樂".matches(regex));   //true
		System.out.println("快樂樂樂".matches(regex));    //true
		System.out.println("高高興興".matches(regex));    //true
		System.out.println("死啦死啦".matches(regex));*/    //flase
		
		//疊詞 死啦死啦,高興高興
		String regex2 = "(..)\\1";
		System.out.println("死啦死啦".matches(regex2));     //true
		System.out.println("高興高興".matches(regex2));     //true
		System.out.println("快快樂樂".matches(regex2));      //flase
	}

}








相關文章