今天來說說'什麼是正規表達式,它是一種描述字串模式的語法,用來匹配、搜尋或取代文字。
它的結構是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個特殊字元
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.1 、2001:db8::1 |
Patterns.DOMAIN_NAME |
驗證網域名稱 | example.com |
Patterns.EMAIL_USERNAME |
驗證 Email 使用者名稱部分 | user.name |
Patterns.ALL_ASCII |
驗證是否全部為 ASCII 字元 | 英文、數字、符號等 ASCII 字元 |
Patterns.ACRONYMS |
驗證縮寫字母 | 簡寫字詞 |
注意事項:
補充:這些Patterns類別中的正規表達式主要是簡化、模板化版本,方便快速驗證常見格式,但不適合做精細、全面的格式驗證。若需要嚴謹的格式驗證,如需要更仔細的正規化還是得參考上面的正規表達式
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); // 輸出:我的電話是 ****-***-***
}
}