java基礎(16):正則表達式、Date、DateFormat、Calendar

来源:https://www.cnblogs.com/liuhui0308/archive/2019/10/08/11638711.html
-Advertisement-
Play Games

1. 正則表達式 1.1 正則表達式的概念 正則表達式(英語:Regular Expression,在代碼中常簡寫為regex)。 正則表達式是一個字元串,使用單個字元串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字元串。在開發中,正則表達式通常被用來檢索、替換那些符合某個規則的文本。 1 ...


1. 正則表達式

1.1 正則表達式的概念

正則表達式(英語:Regular Expression,在代碼中常簡寫為regex)。

正則表達式是一個字元串,使用單個字元串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字元串。在開發中,正則表達式通常被用來檢索、替換那些符合某個規則的文本。

1.2正則表達式的匹配規則

參照幫助文檔,在Pattern類中有正則表達式的的規則定義,正則表達式中明確區分大小寫字母。我們來學習語法規則。

正則表達式的語法規則:

字元:x

含義:代表的是字元x

例如:匹配規則為 "a",那麼需要匹配的字元串內容就是 ”a”

 

字元:\\

含義:代表的是反斜線字元'\'

例如:匹配規則為"\\" 那麼需要匹配的字元串內容就是 ”\”

 

字元:\t

含義:製表符

例如:匹配規則為"\t" ,那麼對應的效果就是產生一個製表符的空間

 

字元:\n

含義:換行符

例如:匹配規則為"\n",那麼對應的效果就是換行,游標在原有位置的下一行

 

字元:\r

含義:回車符

例如:匹配規則為"\r" ,那麼對應的效果就是回車後的效果,游標來到下一行行首

 

字元類:[abc]

含義:代表的是字元ab c

例如:匹配規則為"[abc]" ,那麼需要匹配的內容就是字元a,或者字元b,或字元c的一個

 

字元類:[^abc]

含義:代表的是除了 ab c以外的任何字元

例如:匹配規則為"[^abc]",那麼需要匹配的內容就是不是字元a,或者不是字元b,或不是字元c的任意一個字元

 

字元類:[a-zA-Z]

含義:代表的是a z A Z,兩頭的字母包括在內

例如:匹配規則為"[a-zA-Z]",那麼需要匹配的是一個大寫或者小寫字母

 

字元類:[0-9]

含義:代表的是 09數字,兩頭的數字包括在內

例如:匹配規則為"[0-9]",那麼需要匹配的是一個數字

 

字元類:[a-zA-Z_0-9]

含義:代表的字母或者數字或者下劃線(即單詞字元)

例如:匹配規則為" [a-zA-Z_0-9] ",那麼需要匹配的是一個字母或者是一個數字或一個下滑線

 

預定義字元類:.

含義:代表的是任何字元

例如:匹配規則為" . ",那麼需要匹配的是一個任意字元。如果,就想使用 . 的話,使用匹配規則"\\."來實現

 

預定義字元類:\d

含義:代表的是 09數字,兩頭的數字包括在內,相當於[0-9]

例如:匹配規則為"\d ",那麼需要匹配的是一個數字

 

預定義字元類:\w

含義:代表的字母或者數字或者下劃線(即單詞字元),相當於[a-zA-Z_0-9]

例如:匹配規則為"\w ",,那麼需要匹配的是一個字母或者是一個數字或一個下滑線

 

邊界匹配器:^

含義:代表的是行的開頭

例如:匹配規則為^[abc][0-9]$ ,那麼需要匹配的內容從[abc]這個位置開始, 相當於左雙引號

 

邊界匹配器:$

含義:代表的是行的結尾

例如:匹配規則為^[abc][0-9]$ ,那麼需要匹配的內容以[0-9]這個結束, 相當於右雙引號

 

邊界匹配器:\b

含義:代表的是單詞邊界

例如:匹配規則為"\b[abc]\b" ,那麼代表的是字母abc的左右兩邊需要的是非單詞字元([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之間

1.3 正則表達式規則匹配練習

請寫出滿足如下匹配規則的字元串:

 

規則:"[0-9]{6,12}"

該規則需要匹配的內容是:長度為6位到12位的數字。
如:使用數據"123456789"進行匹配結果為true;
使用數據"12345"進行匹配結果為false。

規則:"1[34578][0-9]{9}"

該規則需要匹配的內容是:11位的手機號碼,第1位為1,第2位為3、4、5、7、8中的一個,後面9位為0到9之間的任意數字。
如:使用數據"12345678901"進行匹配結果為false;
使用數據"13312345678"進行匹配結果為true。

規則:"a*b"

該規則需要匹配的內容是:在多個a或零個a後面有個b;b必須為最後一個字元。
如:使用數據"aaaaab"進行匹配結果為true;
使用數據"abc"進行匹配結果為false。

1.4 字元串類中涉及正則表達式的常用方法

 

 

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位為3、4、5、7、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 s = "18 22 40 65";
    String regex = " ";
    String[] result = s.split(regex);

public String replaceAll(String regex,String replacement)  //將符合規則的字元串內容,全部替換為新字元串

舉例:把文字中的數字替換成*
代碼演示:
    String s = "Hello12345World6789012";
    String regex = "[0-9]";
    String result = s.replaceAll(regex, "*");

1.5 正則表達式練習

匹配正確的數字

匹配規則:
    匹配正整數:”\\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+)+”

2. Date

2.1 Date類概述

Date 表示特定的瞬間,精確到毫秒。

 

繼續查閱Date類的描述,發現Date擁有多個構造函數,只是部分已經過時,但是其中有未過時的構造函數可以把毫秒值轉成日期對象。

//創建日期對象,把當前的毫秒值轉成日期對象
Date date = new Date(1607616000000L);
System.out.println(date);
//列印結果:Fri Dec 11 00:00:00 CST 2020

可是將毫秒值轉成日期後,輸出的格式不利於我們閱讀,繼續查閱APIDate中有getYeargetMouth等方法,但是他們已經過時,繼續往下查閱,看到了toString方法。

 

 

點開toString()方法查閱,原來上面列印的date對象就是預設調用了這個toString方法,並且在這個方法下麵還有讓我們參見toLocaleString方法,點進去,這個方法又過時了,從 JDK 1.1 開始,由 DateFormat.format(Date date) 取代。

既然這個方法被DateFormat.format(Date date) 取代,那麼就要去查閱DateFormat類。

2.2 Date類常用方法

l  把日期對象轉換成對應的時間毫秒值

 

 

 

3. DateFormat

3.1  DateFormat類概述

DateFormat 是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化並解析日期或時間。日期/時間格式化子類(如 SimpleDateFormat)允許進行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和標準化。

我們通過這個類可以幫我們完成日期和文本之間的轉換。

 

繼續閱讀APIDateFormat 可幫助進行格式化並解析任何語言環境的日期。對於月、星期,甚至日曆格式(陰曆和陽曆),其代碼可完全與語言環境的約定無關。

3.2 日期格式

要格式化一個當前語言環境下的日期也就是日期 -> 文本),要通過下麵的方法來完成。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類的說明,這裡做簡單介紹,規則是在一個字元串中,會將以下字母替換成對應時間組成部分,剩餘內容原樣輸出

當出現y時,會將y替換成年

當出現M時,會將M替換成月

當出現d時,會將d替換成日

當出現H時,會將H替換成時

當出現m時,會將m替換成分

 

當出現s時,會將s替換成秒

3.3 DateFormat類常用方法

 

 

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

4. Calendar

4.1 Calendar類概念

Calendar是日曆類,在Date後出現,替換掉了許多Date的方法。該類將所有可能用到的時間信息封裝為靜態成員變數,方便獲取。

Calendar為抽象類,由於語言敏感性,Calendar類在創建對象時並非直接創建,而是通過靜態方法創建,將語言敏感內容處理好,再返回子類對象,如下:

Calendar類靜態方法

 

 

 Calendar c = Calendar.getInstance();  //返回當前時間

 

4.2 Calendar類常用方法

 

 

public static Calendar getInstance() //獲取日期對象

public int get(int field)   //獲取時間欄位值,欄位參見幫助文檔

YEAR 

MONTH 月,從0開始算起,最大110代表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
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 策略模式: 1、定義:定義了一系列演算法,並將每個演算法封裝起來,使它們可以相互替換,且演算法的變化不會影響使用演算法的客戶 2、模型結構: (1)抽象策略(Strategy)類:定義了一個公共介面,各種不同的演算法以不同的方式實現這個介面, 環境角色使用這個介面調用不同的演算法,一般使用介面或抽象類實現 (2 ...
  • 迭代器模式(Iterator): 迭代器模式允許你訪問一個數據項序列中的所有元素,而無須關心序列是什麼類型(數組、鏈表、列表或任何其他類型)。它能有效地構建一個數據管道,經過一系列不同的轉換或過濾後再從管道的另一端出來。迭代器模式就是提供一種遍歷集合元素的統一介面,用一致的方法遍歷集合元素,不需要知 ...
  • 一、概述 單例模式是設計模式中相對簡單且非常常見的一種設計模式,但是同時也是非常經典的 高頻 面試題,相信還是有很多人在面試時會掛在這裡。本篇文章主要針對單例模式做一個回顧,記錄單例模式的應用場景、常見寫法、針對線程安全進行調試(看得見的線程)以及總結。相信大家看完這篇文章之後,對單例模式有一個非常 ...
  • 原文地址: "梁桂釗的博客" 博客地址: "http://blog.720ui.com" 歡迎關註公眾號:「服務端思維」。一群同頻者,一起成長,一起精進,打破認知的局限性。 漫談 GOF 設計模式在 Spring 框架中的實現 在開始正文之前,請你先思考幾個問題: 你項目中有使用哪些 GOF 設計模 ...
  • Josephus問題,在這個古老的問題中,N個深陷絕境的人一致同意通過以下方式減少生存的人數。他們圍坐一圈(位置記為0~N-1)並從第一個人報數,報到M的人會被殺死, 知道最後一個人留下來。傳說中Josephus找到了不會被殺死的位置。 接收N和M的值,列印出被殺死的順序: ...
  • 一、IDE上繼續新建工程 1.在src目錄下新建軟體包:package機制後面再講,目前先用著 2.給package命名一個名稱:com.bjpowernode.java_learning 3.軟體包下新建一個類 4.軟體包是Java語法中的一部分,後面再講 面向對象的封裝性 二、快捷鍵 CTRL ...
  • 1. 基本類型包裝類 大家回想下,在第三篇文章中我們學習Java中的基本數據類型時,說Java中有8種基本的數據類型,可是這些數據是基本數據,想對其進行複雜操作,變的很難。怎麼辦呢? 1.1 基本類型包裝類概述 在實際程式使用中,程式界面上用戶輸入的數據都是以字元串類型進行存儲的。而程式開發中,我們 ...
  • 1. 快速入門 (1)我們從官網下載源碼 BCrypt 官網 http://www.mindrot.org/projects/jBCrypt/ (2)新建工程,將源碼類BCrypt拷貝到工程 (3)新建測試類,main方法中編寫代碼,實現對密碼的加密 String gensalt = BCrypt. ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...