1. 程式人生 > 實用技巧 >Java之XML、正則表示式

Java之XML、正則表示式

第一章 XML

知識點 - 1.1 XML介紹

目標

  • 瞭解xml的概述和作用

路徑

  • 什麼是XML
  • XML 與 HTML 的主要差異
  • XML的作用

講解

1.1 什麼是XML

  • XML 指可擴充套件標記語言(EXtensibleMarkupLanguage

  • XML是用來傳輸資料的,不是用來顯示資料的。之後學習另外一個HTML是用來顯示資料的。

  • XML 標籤沒有被預定義。您需要自行定義標籤。

  • XML 是W3C 的推薦標準

    W3C在1988年2月釋出1.0版本,2004年2月又釋出1.1版本,但因為1.1版本不能向下相容1.0版本,所以1.1沒有人用。同時,在2004年2月W3C又釋出了1.0版本的第三版。我們要學習的還是1.0版本。

1.2 XML 與 HTML 的主要差異

  • html語法鬆散,xml語法嚴格,區分大小寫
  • html做頁面展示,xml傳輸資料
  • html所有標籤都是預定義的,xml所有標籤都是自定義的

1.3 xml的作用

  • 作為配置檔案。 javaee框架 ssm大部分都會使用xml作為配置檔案

  • XML可以儲存資料 , 作為資料交換的載體(使用XML格式進行資料的傳輸)。

小結

  • xml概述: W3C組織釋出的,xml中的所有標籤沒有預定義,標籤區分大小寫, 我們自己可以自定義標籤
  • xml作用: 可以用來儲存資料,作為配置檔案

知識點 - 1.2 XML組成元素

目標

  • 我們知道了XML是什麼, 接下來我們來了解一下XML它是由什麼組成的.

路徑

  • XML的組成元素

講解

一個標準XML檔案一般由以下幾部分組成:文件宣告、元素、屬性、註釋、轉義字元、字元區。

文件宣告
<?xml version="1.0" encoding="utf-8" ?>
  1. 說明:
    1.文件宣告可以沒有
    2.文件宣告必須在第0行0列
    3.文件宣告是以<?xml開頭,以?>結尾
    4.文件宣告有2個屬性,version表示xml版本,encoding表示編碼
    
元素\標籤
  1. 元素是XML中最重要的組成部分,元素也叫標籤

  2. 標籤分為開始標籤和結束標籤,開始標籤<名字> 結束標籤</名字>

  3. 開始標籤和結束標籤中間寫的是標籤內容,標籤的內容可以是文字,也可以是其他標籤

  4. 如果標籤沒有任何內容,那麼可以定義空標籤(比如:<名字/>)

  5. 標籤可以巢狀,但是不能亂巢狀

  6. 一個XML檔案只有一個根標籤

  7. 命名規則:
    ​ 不要使用XML xML xml 寫樣的單詞

    ​ 不能使用空格,冒號

    ​ 命名區分大小寫

    數字不能開頭

    <?xml version="1.0" encoding="UTF-8" ?>
    <person>
        <name>唐三</name>
        <age>年齡</age>
        <aaa/>
    </person>
    
屬性
  1. 位置: 屬性是元素的一部分,它必須出現在元素的開始標籤中,不能寫在結束標籤中

  2. 格式: 屬性的定義格式:屬性名=“屬性值”,其中屬性值必須使用單引或雙引號括起來

  3. 一個元素可以有0~N個屬性,但一個元素中不能出現同名屬性

  4. 屬性名不能使用空格 , 不要使用冒號等特殊字元,且必須以字母開頭

  5. 空標籤中也可以定義屬性

<?xml version="1.0" encoding="UTF-8" ?>
<person>
    <name id = "001" level = '98'>唐三</name>
    <age>10</age>

    <aaa type = 'itheima' />
</person>
註釋
<!--註釋內容-->
  • XML的註釋,既以<!--開始,-->結束。
  • 註釋不能巢狀
  • idea上快捷鍵: ctrl + /
轉義字元

​ 因為有些特殊的字元在XML中是不會被識別的,所以在元素體或屬性值中想使用這些符號就必須使用轉義字元(也叫實體字元),例如:">"、"<"、"'"、"""、"&"。

注意:嚴格地講,在 XML 中僅有字元 "<"和"&" 是非法的。省略號、引號和大於號是合法的,但是把它們替換為實體引用是個好的習慣。

轉義字元應用示例:

<price> 蘋果的價格: price > 5 &amp;&amp;  price &lt; 10</price>
字元區(瞭解)
  • CDATA 內部的所有東西都會被解析器忽略,當做文字

  • 快捷鍵: CD
    
<![CDATA[
	文字資料
]]>
<!--寫步驟 -->
<>
<!>
<![]>
<![CDATA]>
<![CDATA[ 文字 ]]>

<!-- 案例 -->
 <price>
        <![CDATA[
            蘋果的價格: price > 5 &&  price < 10
        ]]>
 </price>

知識點 - 1.3 XML檔案的約束-DTD約束(瞭解)

目標

  • 能夠根據DTD約束正確書寫xml

路徑

  • 概念
  • 根據DTD約束正確書寫XML

講解

xml約束概述

  • 在XML技術裡,可以編寫一個文件來約束一個XML文件的書寫規範,這稱之為XML約束。
  • 約束文件定義了在XML中允許出現的元素(標籤)名稱、屬性及元素(標籤)出現的順序等等。
  • 兩種約束:DTD約束(檔案字尾為dtd),Schema約束(檔案字尾為xsd)
  • 注意: 約束不是我們要寫的東西,我們的工作是根據約束去寫XML

根據DTD約束寫XML

  • DTD約束文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--
    複製內容如下到XML檔案中:
        <!DOCTYPE 書架 SYSTEM "bookdtd.dtd">
-->
<!--
對元素的約束:
ELEMENT表示這是一個元素 書架表示根標籤  書是書架的子標籤  +數量詞,表示出現的次數,至少出現一次(大於等於1次)
-->
<!ELEMENT 書架 (書+)>
<!--書 這是一個標籤  書標籤中包含書名,作者,售價這些子標籤 ,表示子標籤出現的順序關係-->
<!ELEMENT 書 (書名,作者,售價)>
<!--書名 這是一個標籤  #PCDATA標籤型別 書名標籤中是文字-->
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>

<!--ATTLIST表示對屬性的約束 對書標籤的 id,編號,出版社,type屬性進行約束 -->
<!--屬性名為id 屬性的型別為ID(ID型別表示唯一,並且不能以數字開頭) #REQUIRED表示id屬性必須要有 -->
<!--屬性名為編號  屬性的型別為CDATA(文字) #IMPLIED表示編號屬性可有可無-->
<!--屬性名為出版社 屬性的型別為列舉型別(任選其一)  "傳智播客" 預設值為傳智播客-->
<!-- 屬性名為type 屬性的型別為CDATA文字 #FIXED表示固定值為 "IT" -->
<!ATTLIST 書
        id ID #REQUIRED
        編號 CDATA #IMPLIED
        出版社 (清華|北大|傳智播客) "傳智播客"
        type CDATA #FIXED "IT"
        >       
  • XML

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE 書架 SYSTEM "bookdtd.dtd">
    <書架>
        <書 id="a1" 編號="001" 出版社="清華" type="IT">
            <書名>斗羅大陸</書名>
            <作者>唐家三少</作者>
            <售價>99.8</售價>
        </書>
        <書 id="a2">
            <書名>java從入門到放棄</書名>
            <作者>無名氏</作者>
            <售價>9.8</售價>
        </書>
    </書架>
    

語法(瞭解)

文件宣告(瞭解)
  1. 內部DTD,在XML文件內部嵌入DTD,只對當前XML有效。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 [元素宣告]>><!--內部DTD-->
    
  2. 外部DTD—本地DTD,DTD文件在本地系統上,企業內部自己專案使用。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 SYSTEM "檔名"><!--外部本地DTD-->
    
  3. 外部DTD—公共DTD,DTD文件在網路上,一般都有框架提供 , 也是我們使用最多的.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文件的URL">
    
    例如: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    
元素宣告(瞭解)
  1. 約束元素的巢狀層級

    語法

    <!ELEMENT 父標籤 (子標籤1,子標籤2,…)>
    例如:
    <!ELEMENT books (book+)> <!--約束根元素是"books","books"子元素為"book",“+”為數量詞-->
    <!ELEMENT book (name,author,price)><!--約束"book"子元素依次為“name”、“author”、“price”,-->
    
  2. 約束元素體裡面的資料

    語法

    <!ELEMENT 標籤名字 標籤型別>
    例如 <!ELEMENT name (#PCDATA)>
    

    標籤型別: EMPTY(即空元素,例如<hr/>) ANY(任意型別) (#PCDATA) 字串資料

    程式碼

    <!ELEMENT name (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT price (#PCDATA)>
    
  3. 數量詞(掌握)

    數量詞符號 含義
    * 表示元素可以出現0到多個
    + 表示元素可以出現至少1個
    ? 表示元素可以是0或1個
    , 表示元素需要按照順序顯示
    | 表示元素需要選擇其中的某一個
屬性宣告(瞭解)

語法

<!ATTLIST 標籤名稱 
		屬性名稱1 屬性型別1 屬性說明1
		屬性名稱2 屬性型別2 屬性說明2
		…
>
例如
<!ATTLIST book bid ID #REQUIRED>

屬性型別

  • CDATA :表示文字字串
  • ID:表示屬性值唯一,不能以數字開頭
  • ENUMERATED (DTD沒有此關鍵字):表示列舉,只能從列舉列表中任選其一,如(雞肉|牛肉|豬肉|魚肉)

屬性說明:

  • REQUIRED:表示該屬性必須出現
  • IMPLIED:表示該屬性可有可無
  • FIXED:表示屬性的取值為一個固定值。語法:#FIXED "固定值"

屬性說明

程式碼

<!ATTLIST 書									<!--設定"書"元素的的屬性列表-->
		id ID #REQUIRED						 <!--"id"屬性值為必須有-->
		編號 CDATA #IMPLIED				    <!--"編號"屬性可有可無-->
		出版社 (清華|北大|傳智播客) "傳智播客"   <!--"出版社"屬性值是列舉值,預設為“傳智播客”-->
		type CDATA #FIXED "IT"                <!--"type"屬性為文字字串並且固定值為"IT"-->
>
案例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 購物籃 [
   <!ELEMENT 購物籃 (肉+)>
	<!ELEMENT 肉 EMPTY>
	<!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]>
<購物籃>
	<肉 品種="牛肉"></肉>
    <肉 品種="牛肉"></肉>
    <肉 品種="魚肉"></肉>
    <肉/>
</購物籃>

知識點 - 1.4 schema約束(瞭解)

目標

  • 能夠根據schema約束寫出xml文件

路徑

  • 概念
  • 根據schema約束寫出xml文件

講解

概念

schema和DTD一樣, 也是一種XML檔案的約束.

Schema 語言也可作為 XSD(XML Schema Definition)。

Schema約束的檔案的字尾名.xsd

Schema 功能更強大,資料型別約束更完善。

根據schema約束寫出xml文件

  • Schema約束文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--    傳智播客教學例項文件.將註釋中的以下內容複製到要編寫的xml的宣告下面
    複製內容如下到XML檔案中:
    <書架 xmlns="http://www.itcast.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.itcast.cn bookSchema.xsd" >
    -->
    <xs:schema
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.itcast.cn"
            elementFormDefault="qualified">
        <!--element代表元素   元素名 叫 書架-->
        <xs:element name='書架'>
            <!--書架是一個複雜元素-->
            <xs:complexType>
                <!--sequence代表子元素要順序出現 unbounded代表子元素可以出現無數次-->
                <xs:sequence maxOccurs='unbounded'>
                    <!--書架中的子元素叫 書-->
                    <xs:element name='書'>
                        <!--書也是一個複雜元素-->
                        <xs:complexType>
                            <!--書中的子元素是順序出現的-->
                            <xs:sequence>
                                <!--書名是書的子元素 書名是字串型別-->
                                <xs:element name='書名' type='xs:string'/>
                                <!--作者是書的子元素 作者是字串型別-->
                                <xs:element name='作者' type='xs:string'/>
                                <!--售價是書的子元素 售價是小數型別-->
                                <xs:element name='售價' type='xs:double'/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    
  • 根據上面的Schema約束編寫XML

    • 宣告方式

      <書架 xmlns="http://www.itcast.cn"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.itcast.cn bookSchema.xsd" >
              
      
      <?xml version="1.0" encoding="UTF-8" ?>
      <書架 xmlns="http://www.itcast.cn"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.itcast.cn bookSchema.xsd" >
          <書>
              <書名>斗羅大陸</書名>
              <作者>唐家三少</作者>
              <售價>99.8</售價>
          </書>
      
      </書架>
      
<?xml version="1.0" encoding="UTF-8" ?>
<a:書架 xmlns:a="http://www.itcast.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.itcast.cn bookSchema.xsd
    "
    >
    <a:書 bid="1">
        <a:書名>資料庫從入門到刪庫</a:書名>
        <a:作者>榮榮</a:作者>
        <a:售價>99.8</a:售價>
    </a:書>
</a:書架>

第二章 正則表示式

知識點-- 正則表示式的概念及演示

目標

  • 理解正則表示式的概念

路徑

  • 正則表示式的概念及演示

講解

  • 概述: 正則表示式其實就是一個匹配規則,用來替換之前複雜的if結構判斷

  • 在Java中,我們經常需要驗證一些字串,是否符合規則, 例如:校驗qq號碼是否正確,手機號碼是否正確,郵箱是否正確等等。那麼如果使用if就會很麻煩, 而正則表示式就是用來驗證各種字串的規則。它內部描述了一些規則,我們可以驗證使用者輸入的字串是否匹配這個規則。

  • 先看一個不使用正則表示式驗證的例子:下面的程式讓使用者輸入一個QQ號碼,我們要驗證:

    • QQ號碼必須是5--15位長度
    • 而且必須全部是數字
    • 而且首位不能為0
public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("請輸入你的QQ號碼:");
		String qq = sc.next();
		
		System.out.println(checkQQ(qq));
	}
	//我們自己編寫程式碼,驗證QQ號碼
	private static boolean checkQQ(String qq) {
		//1.驗證5--15位
		if(qq.length() < 5 || qq.length() > 15){
			return false;
		}
		//2.必須都是數字;
		for(int i = 0;i < qq.length() ; i++){
			char c = qq.charAt(i);
			if(c < '0' || c > '9'){
				return false;
			}
		}
		//3.首位不能是0;
		char c = qq.charAt(0);
		if(c == '0'){
			return false;
		}
		return true;//驗證通過
	}
	
}
  • 使用正則表示式驗證:
public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("請輸入你的QQ號碼:");
		String qq = sc.next();
		
		System.out.println(checkQQ2(qq));
	}
	//使用正則表示式驗證
	private static boolean checkQQ2(String qq){
		String regex = "[1-9]\\d{4,14}";//正則表示式
		return qq.matches(regex);
	}
}

上面程式checkQQ2()方法中String型別的變數regex就儲存了一個"正則表示式 ",而這個正則表示式就描述了我們需要的三個規則。matches()方法是String類的一個方法,用於接收一個正則表示式,並將"本物件"與引數"正則表示式"進行匹配,如果本物件符合正則表示式的規則,則返回true,否則返回false。

小結

  • 正則表示式其實就是一個匹配規則,用來替換之前複雜的if結構判斷

知識點-- 正則表示式的基本使用

目標

  • 掌握如何書寫正則表示式

路徑

  • 正則表示式-字元類
  • 正則表示式-邏輯運算子
  • 正則表示式-預定義字元
  • 正則表示式-數量詞
  • 正則表示式-分組括號

講解

3.2.1 正則表示式-字元類

  • 語法示例:[] 表示匹配單個字元 ^ 取反 - 範圍

    1. [abc]:代表a或者b,或者c字元中的一個。

    2. [^abc]:代表除a,b,c以外的任何字元。

    3. [a-z]:代表a-z的所有小寫字元中的一個。 左右包含

    4. [A-Z]:代表A-Z的所有大寫字元中的一個。

    5. [0-9]:代表0-9之間的某一個數字字元。

    6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之間的任意一個字元。

    7. [a-dm-p]:a 到 d 或 m 到 p之間的任意一個字元。

  • 程式碼示例:

public class Test1 {
    public static void main(String[] args) {
        String str = "ead";
        //1.驗證str是否以h開頭,以d結尾,中間是a,e,i,o,u中某個字元
         //2.驗證str是否以h開頭,以d結尾,中間不是a,e,i,o,u中的某個字元
        //3.驗證str是否a-z的任何一個小寫字元開頭,後跟ad
        //4.驗證str是否以a-d或者m-p之間某個字元開頭,後跟ad
        
         String str = "ead";
        //1.驗證str是否以h開頭,以d結尾,中間是a,e,i,o,u中某個字元
        System.out.println(str.matches("h[aeiou]d"));// false
        System.out.println("hed".matches("h[aeiou]d"));// true
        System.out.println("head".matches("h[aeiou]d"));// false
        System.out.println("============================================================");

        //2.驗證str是否以h開頭,以d結尾,中間不是a,e,i,o,u中的某個字元
        System.out.println(str.matches("h[^aeiou]d"));// false
        System.out.println("had".matches("h[^aeiou]d"));// false
        System.out.println("hd".matches("h[^aeiou]d"));// false
        System.out.println("hzd".matches("h[^aeiou]d"));// true
        System.out.println("============================================================");

        //3.驗證str是否a-z的任何一個小寫字元開頭,後跟ad
        System.out.println(str.matches("[a-z]ad"));// true
        System.out.println("Aad".matches("[a-z]ad"));// false
        System.out.println("============================================================");

        //4.驗證str是否以a-d或者m-p之間某個字元開頭,後跟ad
        System.out.println(str.matches("[a-dm-p]ad"));// false
        System.out.println("bad".matches("[a-dm-p]ad"));// true
        System.out.println("nad".matches("[a-dm-p]ad"));// true
        System.out.println("nad".matches("[a-d|m-p]ad"));// true

    }
}

3.2.2 正則表示式-邏輯運算子

  • 語法示例:

    1. &&:並且
    2. | :或者
  • 程式碼示例:

public class Test2 {
    public static void main(String[] args) {
        /*
            正則表示式-邏輯運算子
                - 語法示例:
                  1. &&:並且
                  2. |    :或者
         */
       
        //1.要求字串是小寫子音字元開頭,後跟ad  除了a,e,i,o,u之外,其他的都是子音字母
         //2.要求字串是aeiou中的某個字元開頭,後跟ad
        
         String str = "had";
        //1.要求字串是小寫子音字元開頭,後跟ad  除了a,e,i,o,u之外,其他的都是子音字母
        System.out.println(str.matches("[^aeiou]ad"));// true
        System.out.println(str.matches("[a-z&&[^aeiou]]ad"));// true
        System.out.println("aad".matches("[^aeiou]ad"));// false
        System.out.println("aad".matches("[a-z&&[^aeiou]]ad"));// false
        System.out.println("===================================================");

        //2.要求字串是aeiou中的某個字元開頭,後跟ad
        System.out.println(str.matches("[aeiou]ad"));// false;
        System.out.println(str.matches("[a|e|i|o|u]ad"));// false;
        System.out.println("aad".matches("[aeiou]ad"));// true
        System.out.println("aad".matches("[a|e|i|o|u]ad"));// true
    }
}


3.2.3 正則表示式-預定義字元

  • 語法示例:

    1. "." : 匹配任何字元。如果要表示一個字元點,那麼就得使用\.
    2. "\d":任何數字[0-9]的簡寫;
    3. "\D":任何非數字[^0-9]的簡寫;
    4. "\s": 空白字元:[ \t\n\x0B\f\r] 的簡寫
    5. "\S": 非空白字元:[^\s] 的簡寫
    6. "\w":單詞字元:[a-zA-Z_0-9]的簡寫
    7. "\W":非單詞字元:[^\w]
  • 程式碼示例:

public class Test3 {
    public static void main(String[] args) {
        /*
            正則表示式-預定義字元
                - 語法示例:
                  1. "." : 匹配任何字元。如果要表示一個字元點,那麼就得使用\.
                  2. "\d":任何數字[0-9]的簡寫;
                  3. "\D":任何非數字[^0-9]的簡寫;
                  4. "\s": 空白字元:[ \t\n\x0B\f\r] 的簡寫
                  5. "\S": 非空白字元:[^\s] 的簡寫
                  6. "\w":單詞字元:[a-zA-Z_0-9]的簡寫
                  7. "\W":非單詞字元:[^\w]
         */
         //1.驗證str是否3位數字
        //2.驗證手機號:1開頭,第二位:3/5/8,剩下9位都是0-9的數字
        //3.驗證字串是否以h開頭,以d結尾,中間是任何字元
        //4.驗證str是否是:h.d
        String str = "258";
        //1.驗證str是否3位數字
        System.out.println(str.matches("[0-9][0-9][0-9]"));// true
        System.out.println(str.matches("\\d\\d\\d"));// true
        System.out.println("a58".matches("\\d\\d\\d"));// false
        System.out.println("====================================================");

        //2.驗證手機號:1開頭,第二位:3/5/8,剩下9位都是0-9的數字
        System.out.println(str.matches("[1][358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// false
        System.out.println("13866668888".matches("[1][358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// true
        System.out.println("17666668888".matches("[1][358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// false
        System.out.println("====================================================");

        //3.驗證字串是否以h開頭,以d結尾,中間是任何字元
        System.out.println(str.matches("h.d"));// false
        System.out.println("h%d".matches("h.d"));// true
        System.out.println("====================================================");

        //4.驗證str是否是:h.d
        System.out.println(str.matches("h\\.d"));// false
        System.out.println("h%d".matches("h\\.d"));// false
        System.out.println("h.d".matches("h\\.d"));// true
        System.out.println("====================================================");


        String str1 = "itheiam.itcast.baidu.taobao";
        String[] arr = str1.split("\\.");
        for (String s : arr) {
            System.out.println(s);
        }

    }
}

3.2.4 正則表示式-數量詞

  • 語法示例:

    1. X? : 0次或1次
    2. X* : 0次到多次
    3. X+ : 1次或多次
    4. X{n} : 恰好n次
    5. X{n,} : 至少n次(包含n)
    6. X{n,m}: n到m次(n和m都是包含的)
  • 程式碼示例:

public class Test4 {
    public static void main(String[] args) {
        /*
            正則表示式-數量詞
                - 語法示例:
                  1. X? : 0次或1次
                  2. X* : 0次到多次
                  3. X+ : 1次或多次
                  4. X{n} : 恰好n次
                  5. X{n,} : 至少n次  包含n
                  6. X{n,m}: n到m次(n和m都是包含的)

         */
         //1.驗證str是否是三位數字
          //2.驗證str是否是多位數字
        //3.驗證str是否是手機號:1).第一位為1 2).第二位是3,5,8 3).後面9位都是數字
        //4.驗證qq號碼:1).5--15位;2).全部是數字;3).第一位不是0
        
             String str = "258";
        //1.驗證str是否3位數字
        System.out.println(str.matches("[0-9]{3}"));// true
        System.out.println(str.matches("\\d{3}"));// true
        System.out.println("a58".matches("\\d{3}"));// false
        System.out.println("======================================================");

        //2.驗證str是否是多位數字
        System.out.println(str.matches("\\d+"));// true
        System.out.println("2".matches("\\d+"));// true
        System.out.println("2".matches("\\d*"));// true
        System.out.println("2".matches("\\d?"));// true
        System.out.println("".matches("\\d+"));// false
        System.out.println(" ".matches("\\d+"));// false
        System.out.println("======================================================");

        //3.驗證str是否是手機號:1).第一位為1 2).第二位是3,5,8 3).後面9位都是數字
        System.out.println(str.matches("[1][358]\\d{9}"));// false
        System.out.println("13866668888".matches("[1][358]\\d{9}"));// true
        System.out.println("17666668888".matches("[1][358]\\d{9}"));// false
        System.out.println("======================================================");


        //4.驗證qq號碼:1).5--15位;2).全部是數字;3).第一位不是0
        System.out.println("1234".matches("[1-9]\\d{4,14}"));// false
        System.out.println("123456789".matches("[1-9]\\d{4,14}"));// true
        System.out.println("01234455657".matches("[1-9]\\d{4,14}"));// false
        System.out.println("1323243a2323".matches("[1-9]\\d{4,14}"));// false
    }
}

3.2.5 正則表示式-分組括號( )

public class Test5 {
    public static void main(String[] args) {
        /*
            正則表示式-分組括號( )
         */
            String str = "DG8FV-B9TKY-FRT9J-99899-XPQ4G";
        // 分成5組: 前面4組的規則是一樣的 後面一組單獨規則
        System.out.println(str.matches("[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}"));// true
        System.out.println(str.matches("([A-Z0-9]{5}-){4}([A-Z0-9]{5})"));// true
        System.out.println("======================================================================");
        // 擴充套件: 匹配疊詞
        // 嘿嘿  呵呵哈哈    呵呵呵哈哈哈  高興高興
        // (.)代表第一組,\\1表示第一組再出現一次
        System.out.println("嘿嘿".matches("(.)\\1"));// true
        // 第一個(.)代表第一組,\\1表示第一組再出現一次;第二個(.)代表第二組,\\2表示第二組再出現一次
        System.out.println("呵呵哈哈".matches("(.)\\1(.)\\2"));// true
        // 第一個(.)代表第一組,\\1表示第一組再出現一次;第二個(.)代表第二組,\\2表示第二組再出現一次;第三個(.)代表第三組,\\3表示第三組再出現一次
        System.out.println("呵呵哈哈嘿嘿".matches("(.)\\1(.)\\2(.)\\3"));// true
        // 第一個(.)代表第一組,\\1表示第一組再出現一次,{2}表示第一組總共出現2次;第二個(.)代表第二組,\\2表示第二組再出現一次,{2}第二組總共出現2次
        System.out.println("呵呵呵哈哈哈".matches("(.)\\1{2}(.)\\2{2}"));// true
        System.out.println("高興高興".matches("(..)\\1"));// true
    }
}

知識點-- String中正則表示式的使用

目標

在String中也有幾個方法是可以使用正則表示式來操作的, 下面我們來學習一下

路徑

  • String的split方法中使用正則表示式
  • String類的replaceAll方法中使用正則表示式

講解

3.3.1 String的split方法中使用正則表示式

  • String類的split()方法原型:

    public String[] split(String regex)//引數regex就是一個正則表示式。可以將當前字串中匹配regex正則表示式的符號作為"分隔符"來切割字串。
    
  • 程式碼示例:

public class Demo {
	public static void main(String[] args) {
		String str = "18  4 567       99     56";
		String[] strArray = str.split(" +");
		for (int i = 0; i < strArray.length; i++) {
			System.out.println(strArray[i]);
		}
	}
}

3.3.2 String類的replaceAll方法中使用正則表示式

  • String類的replaceAll()方法原型:
public String replaceAll(String regex,String newStr)//引數regex就是一個正則表示式。可以將當前字串中匹配regex正則表示式的字串替換為newStr。
  • 程式碼示例:
public class Demo {
    public static void main(String[] args) {
        //將下面字串中的"數字"替換為"*"
        String str = "jfdk432jfdk2jk24354j47jk5l31324";
        System.out.println(str.replaceAll("\\d+", "*"));
    }
}

總結

- 能夠說出XML的作用
    作為配置檔案
    用來儲存資料,作為資料交換的載體
- 瞭解XML的組成元素
    文件宣告
    標籤
    屬性
    註釋
    轉義字元
    字元區
- 能夠說出有哪些XML約束技術
    dtd(.dtd),schema(.xsd)
- 能夠說出解析XML文件DOM方式原理
    xml檔案載入成一個Dom樹,生成一個Document物件,通過Document物件獲取根元素,然後進行操作....
- 能夠使用dom4j解析XML文件
    建立解析器
    解析xml: 讀取xml檔案,生成Document物件
    根據Document物件獲取根元素
    使用根元素獲取子元素進行操作...
        
- 能夠使用xpath解析XML
   document物件的方法:
		selectSingleNode(String xpath)獲取單個節點
        selectNodes() 獲取多個節點  
- 能夠理解正則表示式的作用
      可以作為匹配規則,替換之前複雜的if判斷操作
- 能夠使用正則表示式的字元類
      []匹配單個字元, ^ 取反   -範圍
      		1. [abc]:代表a或者b,或者c字元中的一個。
            2. [^abc]:代表除a,b,c以外的任何字元。
            3. [a-z]:代表a-z的所有小寫字元中的一個。 左右包含
            4. [A-Z]:代表A-Z的所有大寫字元中的一個。
            5. [0-9]:代表0-9之間的某一個數字字元。
            6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之間的任意一個字元。
            7. [a-dm-p]:a 到 d 或 m 到 p之間的任意一個字元。
- 能夠使用正則表示式的邏輯運算子
       &&
        |
- 能夠使用正則表示式的預定義字元類
        .     任意字元
        \\d   0-9數字
         \\D  非0-9數字
         \\w  [A-Za-z_0-9]
          \\W  非[A-Za-z_0-9]
         \\s    空白字元
          \\S   非空白字元
- 能夠使用正則表示式的數量詞
       ? 0個或1個
       *  0個或多個
       +  1個或多個
       {n} 恰好n次
        {n,m} n到m次,包含n和m
        {n,}  至少n次,包含n
- 能夠使用正則表示式的分組
     () 
     ()\\1
     ()\\2
     ...
- 能夠在String的split方法中使用正則表示式
   String[] split(String regex) 根據正在表示式的規則進行分割
   String replaceAll(String regex,String newStr)