正則表達式(英語:Regular Expression,在代碼中常簡寫爲regex)。正則表達式是一個字符串,使用單個字符串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字符串。在開發中,正則表達式一般被用來檢索、替換那些符合某個規則的文本。正則表達式
參照幫助文檔,在Pattern類中有正則表達式的的規則定義,正則表達式中明確區分大小寫字母。咱們來學習語法規則。函數
正則表達式的語法規則:學習
字符:x 含義:表明的是字符x 例如:匹配規則爲 "a",那麼須要匹配的字符串內容就是 」a」
字符:\\ 含義:表明的是反斜線字符'\' 例如:匹配規則爲"\\" ,那麼須要匹配的字符串內容就是 」\」
字符:\t 含義:製表符 例如:匹配規則爲"\t" ,那麼對應的效果就是產生一個製表符的空間
字符:\n 含義:換行符 例如:匹配規則爲"\n",那麼對應的效果就是換行,光標在原有位置的下一行
字符:\r 含義:回車符 例如:匹配規則爲"\r" ,那麼對應的效果就是回車後的效果,光標來到下一行行首
字符類:[abc] 含義:表明的是字符a、b 或 c 例如:匹配規則爲"[abc]" ,那麼須要匹配的內容就是字符a,或者字符b,或字符c的一個
字符類:[^abc] 含義:表明的是除了 a、b 或 c之外的任何字符 例如:匹配規則爲"[^abc]",那麼須要匹配的內容就是否是字符a,或者不是字符b,或不是字符c的任意一個字符
字符類:[a-zA-Z] 含義:表明的是a 到 z 或 A 到 Z,兩頭的字母包括在內 例如:匹配規則爲"[a-zA-Z]",那麼須要匹配的是一個大寫或者小寫字母
字符類:[0-9] 含義:表明的是 0到9數字,兩頭的數字包括在內 例如:匹配規則爲"[0-9]",那麼須要匹配的是一個數字
字符類:[a-zA-Z_0-9] 含義:表明的字母或者數字或者下劃線(即單詞字符) 例如:匹配規則爲" [a-zA-Z_0-9] ",那麼須要匹配的是一個字母或者是一個數字或一個下滑線
預約義字符類:. 含義:表明的是任何字符 例如:匹配規則爲" . ",那麼須要匹配的是一個任意字符。若是,就想使用 . 的話,使用匹配規則"\\."來實現
預約義字符類:\d 含義:表明的是 0到9數字,兩頭的數字包括在內,至關於[0-9] 例如:匹配規則爲"\d ",那麼須要匹配的是一個數字
預約義字符類:\w 含義:表明的字母或者數字或者下劃線(即單詞字符),至關於[a-zA-Z_0-9] 例如:匹配規則爲"\w ",,那麼須要匹配的是一個字母或者是一個數字或一個下滑線
邊界匹配器:^ 含義:表明的是行的開頭 例如:匹配規則爲^[abc][0-9]$ ,那麼須要匹配的內容從[abc]這個位置開始, 至關於左雙引號
邊界匹配器:$ 含義:表明的是行的結尾 例如:匹配規則爲^[abc][0-9]$ ,那麼須要匹配的內容以[0-9]這個結束, 至關於右雙引號
邊界匹配器:\b 含義:表明的是單詞邊界 例如:匹配規則爲"\b[abc]\b" ,那麼表明的是字母a或b或c的左右兩邊須要的是非單詞字符([a-zA-Z_0-9])
數量詞:X? 含義:表明的是X出現一次或一次也沒有 例如:匹配規則爲"a?",那麼須要匹配的內容是一個字符a,或者一個a都沒有
數量詞:X* 含義:表明的是X出現零次或屢次 例如:匹配規則爲"a*" ,那麼須要匹配的內容是多個字符a,或者一個a都沒有
數量詞:X+ 含義:表明的是X出現一次或屢次 例如:匹配規則爲"a+",那麼須要匹配的內容是多個字符a,或者一個a
數量詞:X{n} 含義:表明的是X出現剛好 n 次 例如:匹配規則爲"a{5}",那麼須要匹配的內容是5個字符a
數量詞:X{n,} 含義:表明的是X出現至少 n 次 例如:匹配規則爲"a{5, }",那麼須要匹配的內容是最少有5個字符a
數量詞:X{n,m} 含義:表明的是X出現至少 n 次,可是不超過 m 次 例如:匹配規則爲"a{5,8}",那麼須要匹配的內容是有5個字符a 到 8個字符a之間
請寫出知足以下匹配規則的字符串:spa
規則:"[0-9]{6,12}"code
該規則須要匹配的內容是:長度爲6位到12位的數字。如:使用數據"123456789"進行匹配結果爲true;使用數據"12345"進行匹配結果爲false。orm
規則:"1[34578][0-9]{9}"對象
該規則須要匹配的內容是:11位的手機號碼,第1位爲1,第2位爲三、四、五、七、8中的一個,後面9位爲0到9之間的任意數字。blog
如:使用數據"12345678901"進行匹配結果爲false;使用數據"13312345678"進行匹配結果爲true。開發
規則:"a*b"文檔
該規則須要匹配的內容是:在多個a或零個a後面有個b;b必須爲最後一個字符。
如:使用數據"aaaaab"進行匹配結果爲true;使用數據"abc"進行匹配結果爲false。
public boolean matches(String regex) //判斷字符串是否匹配給定的規則
舉例:校驗qq號碼.
1: 要求必須是5-15位數字
2: 0不能開頭
代碼演示:
String qq = "604154942"; String regex = "[1-9][0-9]{4,14}"; boolean flag2 = qq.matches(regex);
舉例:校驗手機號碼
1:要求爲11位數字
2:第1位爲1,第2位爲三、四、五、七、8中的一個,後面9位爲0到9之間的任意數字。
代碼演示:
String phone = "18800022116"; String regex = "1[34578][0-9]{9}"; boolean flag = phone.matches(regex);
public String[] split(String regex) //根據給定正則表達式的匹配規則,拆分此字符串
舉例:分割出字符串中的的數字
代碼演示:
String s = "18-22-40-65"; String regex = "-"; String[] result = s.split(regex);
String s1 = Arrays.toString(result);
System.err.println(s1);
代碼演示: String s = "18 22 40 65"; String regex = " "; String[] result = s.split(regex);
String s1 = Arrays.toString(result);
System.err.println(s1);
public String replaceAll(String regex,String replacement)//將符合規則的字符串內容,所有替換爲新字符串
舉例:把文字中的數字替換成*
代碼演示:
String s = "Hello12345World6789012"; String regex = "[0-9]"; String result = s.replaceAll(regex, "*");
匹配正確的數字,匹配規則:
匹配正整數:」\\d+」
匹配正小數:」\\d+\\.\\d+」
匹配負整數:」-\\d+」
匹配負小數:」-\\d+\\.\\d+」
匹配保留兩位小數的正數:」\\d+\\.\\d{2}」
匹配保留1-3位小數的正數:」\\d+\\.\\d{1,3}」
匹配合法的郵箱,匹配規則:
」[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+」
」\\w+@\\w+(\\.\\w+)+」
獲取IP地址(192.168.1.100)中的每段數字,匹配規則:
」\\.」
類 Date 表示特定的瞬間,精確到毫秒。
繼續查閱Date類的描述,發現Date擁有多個構造函數,只是部分已通過時,可是其中有未過期的構造函數能夠把毫秒值轉成日期對象。
//建立日期對象,把當前的毫秒值轉成日期對象 Date date = new Date(1607616000000L); System.out.println(date); //打印結果:Fri Dec 11 00:00:00 CST 2020
但是將毫秒值轉成日期後,輸出的格式不利於咱們閱讀,繼續查閱API,Date中有getYear、getMouth等方法,能夠他們已通過時,繼續往下查閱,看到了toString方法。
點開toString()方法查閱,原來上面打印的date對象就是默認調用了這個toString方法,而且在這個方法下面還有讓咱們參見toLocaleString方法,點進去,這個方法又過期了,從 JDK 1.1 開始,由 DateFormat.format(Date date) 取代。既然這個方法被DateFormat.format(Date date) 取代,那麼就要去查閱DateFormat類。
把日期對象轉換成對應的時間毫秒值
Date date = new Date(); l=date.getTime(); System.out.println(l);
毫秒的0點,時間原點; 公元1970年1月1日,午夜0:00:00 英國格林威治 毫秒值就是0
System.currentTimeMillis() 返回值long類型參數,用於獲取當前日期的毫秒值 ,必須依賴毫秒值
DateFormat 是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化並解析日期或時間。日期/時間格式化子類(如 SimpleDateFormat類)容許進行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和標準化。
咱們經過這個類能夠幫咱們完成日期和文本之間的轉換。
繼續閱讀API,DateFormat 可幫助進行格式化並解析任何語言環境的日期。對於月、星期,甚至日曆格式(陰曆和陽曆),其代碼可徹底與語言環境的約定無關。
要格式化一個當前語言環境下的日期也就是日期 -> 文本),要經過下面的方法來完成。DateFormat是抽象類,咱們須要使用其子類SimpleDateFormat來建立對象。
構造方法
DateFormat類方法
代碼演示:
//建立日期格式化對象,在獲取格式化對象時能夠指定風格 DateFormat df= new SimpleDateFormat("yyyy-MM-dd");//對日期進行格式化 Date date = new Date(1607616000000L); String str_time = df.format(date); System.out.println(str_time);//2020年12月11日
DateFormat類的做用:便可以將一個Date對象轉換爲一個符合指定格式的字符串,也能夠將一個符合指定格式的字符串轉爲一個Date對象。
指定格式的具體規則咱們可參照SimpleDateFormat類的說明,這裏作簡單介紹,規則是在一個字符串中,會將如下字母替換成對應時間組成部分,剩餘內容原樣輸出:
format方法,用來將Date對象轉換成String
parse方法,用來將String轉換成Date(轉換時,該String要符合指定格式,不然不能轉換)。
代碼演示:
練習一:把Date對象轉換成String
Date date = new Date(1607616000000L);//Fri Dec 11 00:00:00 CST 2020 DateFormat df = new SimpleDateFormat(「yyyy年MM月dd日」); String str = df.format(date); //str中的內容爲2020年12月11日
練習二:把String轉換成Date對象
String str = 」2020年12月11日」; DateFormat df = new SimpleDateFormat(「yyyy年MM月dd日」); Date date = df.parse( str ); //Date對象中的內容爲Fri Dec 11 00:00:00 CST 2020
Calendar是日曆類,在Date後出現,替換掉了許多Date的方法。該類將全部可能用到的時間信息封裝爲靜態成員變量,方便獲取。
Calendar爲抽象類,因爲語言敏感性,Calendar類在建立對象時並不是直接建立,而是經過靜態方法建立,將語言敏感內容處理好,再返回子類對象,以下:
Calendar c = Calendar.getInstance(); //返回當前時間
public static Calendar getInstance() //獲取日期對象
public int get(int field)//獲取時間字段值,字段參見幫助文檔
YEAR 年
MONTH 月,從0開始算起,最大11;0表明1月,11表明12月。
DATE 天
HOUR 時
MINUTE分
SECOND秒
代碼演示:
Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR);
public void add(int field,int amount)//指定字段增長某值
代碼演示:
Calendar c = Calendar.getInstance(); //修改當前時間爲3天后 c.add(Calendar.DATE, 3); //修改當前時間爲5小時後 c.add(Calendar.HOUR, 5);
public final void set(int field,int value)//設置指定字段的值
代碼演示:
Calendar c = Calendar.getInstance(); //設置時間爲2020年5月20日 c.set(Calendar.YEAR, 2020); c.set(Calendar.MONTH, 4); c.set(Calendar.DATE, 20);
public final Date getTime()//獲取該日曆對象轉成的日期對象
代碼演示:
Calendar c = Calendar.getInstance(); Date d = c.getTime();
注意事項
求出本身已經出生多少天
代碼實現:
public static void main(String[] args) { Calendar my = Calendar.getInstance(); //設置出生年月日 1995-05-10 my.set(Calendar.YEAR, 1995); my.set(Calendar.MONTH, 4); my.set(Calendar.DATE, 10); //計算天數 long day =(System.currentTimeMillis()-my.getTimeInMillis())/(24*60*60*1000L); System.out.println(day);}