iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0

今天來說說'什麼是正規表達式,它是一種描述字串模式的語法,用來匹配、搜尋或取代文字。

常用類:

  • Pattern:編譯正規表達式。
  • Matcher:執行匹配操作。

常用符號

  • .:任意字元
  • *:0 次或多次
  • +:1 次或多次
  • ?:0 次或 1 次
  • [abc]:匹配 a、b 或 c
  • [^abc]:非 a、b、c
  • \d:數字
  • \w:字母、數字或底線

實際應用:

1.Pattern

它的結構是boolean 新變數名稱 = Pattern.matches("限制", 被限制的變數);
較常用到的例子:

"^-?\d+$" 正/負整數
"^-?\d+(\.\d+)?$" 浮點數
"^[a-z]+$" 僅小寫英文字母
"^[A-Za-z]+$" 僅大小寫英文字母
"^[A-Za-z0-9]+$" 僅英文跟數字
"^start.*" 以特定字作為開頭
".*keyword.*" 必須包含關鍵字

較為複雜的例子:

1. "^[\w\.-]+@[\w\.-]+\.\w{2,}$" Email判斷式 ex:test@gmail.com
    ^ : 開頭
    [\w\.-]+ : 必須是英文和數字,不限制字數(但大多不會出現底線)
    \w : 代表英文字母、數字或底線(等同於 [A-Za-z0-9_])
    \.:句點 .(因為點是特殊字元,所以要用 \. 轉義)
    -:連字號 
    +:代表上述的組合可以出現 一次或多次 合起來就是Email中的test部分
    @[\w\.-]+ : 中間必須有特定字符@,@後同上,表示Email中的@gmail或是@stu.edu等
    \.\w{2,}$ : 和上一段文字中間要有一個.連接,後面必須是英文和數字且兩個以上
                結尾,也就是Email中的.com部分

2. "^https?:\/\/[\w\-\.]+\.\w+" 簡單網址判斷式 ex:https://example.com
   ^https?: : 開頭是https且只能出現0~1次,後面須出現一個:
   \/\/ : 後面需接兩個//,因為是特殊字元,所以要用 \/ 轉義
   [\w\-\.]+ : 後方只可加英數字和底線,中間會出現一個連字號,且會出現一個.
               因為點是特殊字元,所以要用 \. 轉義,上述組合可出現多次
   \.\w+ : 網域後綴,例如 .com、.org,\. 是字面句點,\w+ 是至少一個英數字元
   沒有$ : 意味著可以是網址的開頭部分,但後面可能還有 /path 或 ?query=...
   
3. "^(\d{1,3}\.){3}\d{1,3}$" IPv4地址 ex:192.0.0.1
   ^(\d{1,3}\.){3} : 開頭有一個群組,只接受數字,長度為1~3,後面必須加上一個.,且重複3次
   \d{1,3}$ : 最後一段,代表 1~3 位數字(不加點),結束

4. "^09 \d{8}$" 台灣電話號碼 ex:0912345678
   ^09 : 開頭為09
   \d{8}$ : 後續接上8個數字,結束 也就是電話號碼+09後長度必須為10碼

5. "^\d{4}-\d{2}-\d{2}$" 日期格式
   ^\d{4} : 開頭4個數字,代表年分,如2025
   -\d{2} : 後面接上一個連字號,再接續2個數字,代表月份,如07、12
   -\d{2}$ : 同上,代表日期,如19、25,結束

6. "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{8,}$" 至少 8 碼,含大小寫與數字
   ^	字串開頭
   (?=.*[a-z]) : 字串中至少有一個小寫英文字母
   (?=.*[A-Z]) : 字串中至少有一個大寫英文字母
   (?=.*\d) : 字串中至少有一個數字
   [A-Za-z\d]{8,} : 密碼內容必須為英文字母或數字,且長度 至少 8 碼,結束

7. "^(?=.*[!@#$%^&*])(?=.*[A-Za-z])(?=.*\d).{8,}$" 至少 1 特殊字元 
   基本同上,但多了一個?=.*[!@#$%^&*] : 至少1個特殊字元

2.Patterns

Android Studio其實內建了android.util.Pattern,有些正規化就不用向上面那樣打落落長一串,以下是較為常見的

屬性名 用途說明 常見用途示例
Patterns.EMAIL_ADDRESS 驗證 Email 格式 test@example.com
Patterns.PHONE 驗證電話號碼格式 台灣手機、國際電話等
Patterns.WEB_URL 驗證網址 URL 格式 https://www.google.com
Patterns.IP_ADDRESS 驗證 IPv4 或 IPv6 地址 192.168.0.12001:db8::1
Patterns.DOMAIN_NAME 驗證網域名稱 example.com
Patterns.EMAIL_USERNAME 驗證 Email 使用者名稱部分 user.name
Patterns.ALL_ASCII 驗證是否全部為 ASCII 字元 英文、數字、符號等 ASCII 字元
Patterns.ACRONYMS 驗證縮寫字母 簡寫字詞

注意事項:

  • Patterns.EMAIL_ADDRESS:用來驗證 Email,雖然不保證符合所有 RFC 規範,但在多數場景下足夠使用。
  • Patterns.PHONE:檢查較為簡單,主要是確認字串長度與基本結構,通常會驗證電話號碼長度約為 10 碼(視地區而異)。
  • Patterns.WEB_URL:簡單驗證網址格式,不含複雜參數檢查。
  • Patterns.IP_ADDRESS:同時支援 IPv4 和 IPv6。

補充:這些Patterns類別中的正規表達式主要是簡化、模板化版本,方便快速驗證常見格式,但不適合做精細、全面的格式驗證。若需要嚴謹的格式驗證,如需要更仔細的正規化還是得參考上面的正規表達式


3.Matcher

Matcher可搭配Pattern(正則表達式)使用,提供操作字串比對的方法。

主要用法流程:

  • 先建立 Pattern
    透過 Pattern.compile("正則表達式") 建立一個 Pattern 物件。

  • 用 Pattern 建立 Matcher
    透過 pattern.matcher("要比對的字串") 取得 Matcher。

  • 呼叫 Matcher 的方法做比對
    matches():判斷整個字串是否完全符合正則表達式。
    find():尋找字串中符合正則的部分。
    group():取得符合的子字串。
    replaceAll():取代所有匹配的字串。

範例程式碼:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        String text = "我的電話是 0912-345-678";
        Pattern p = Pattern.compile("\\d{4}-\\d{3}-\\d{3}");
        Matcher m = p.matcher(text);
        if (m.find()) {
            System.out.println(m.group());  // 輸出:0912-345-678
        }
        String newText = text.replaceAll("\\d{4}-\\d{3}-\\d{3}", "****-***-***");
        System.out.println(newText);  // 輸出:我的電話是 ****-***-***
    }
}


上一篇
Day 14.Recyclerview
系列文
Android 新手的 30 天進化論:從初學者到小專案開發者15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言