String s = "我我我.......我要學...學學學...編編編程程..";
// 1. 將連續標點替換為單個空格
s = s.replaceAll("\\.+", " ");
// 2. 將連續相同字符壓縮為單個(反向引用 $1)
s = s.replaceAll("(.)\\1+", "$1");
System.out.println(s);
// 輸出:我 我 要 學 學 編 編 程
\\.+ 匹配一個或多個點號;(.)\\1+ 捕獲任意字符並匹配其連續重複,替換為第一個捕獲組 $1。
String ips = "192.168.1.200 17.1.10.10.10 3.3.50.3 127.0.0.1";
// 1. 每段數字前補兩個 0:192 -> 00192
ips = ips.replaceAll("(\\d+)", "00$1");
// 2. 保留每段最後三位:00192 -> 192,003 -> 3
ips = ips.replaceAll("0*(\\d{3})", "$1");
// 3. 分割、字典序排序、還原
String[] arr = ips.split("\\s+");
Arrays.sort(arr);
for (String ip : arr) {
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
// 輸出:
// 3.3.50.3
// 17.1.10.10.10
// 127.0.0.1
// 192.168.1.200
關鍵技巧:將每段統一補齊到固定寬度(此處 3 位),即可直接用字符串字典序實現數值排序。
String mail = "abc12@sina.com";
String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]{2,3}){1,3}";
boolean ok = mail.matches(regex);
System.out.println(mail + ":" + ok); // true
正則解析:
\\w+:用戶名(字母、數字、下劃線)@:字面 @ 符號[a-zA-Z0-9]+:域名主體(\\.[a-zA-Z]{2,3}){1,3}:1~3 個後綴,每個後綴為點號 + 2~3 位字母(如 .com、.cn、.co.uk)| 符號 | 含義 |
|---|---|
. | 任意字符(除換行) |
\\d | 數字 [0-9] |
\\w | 單詞字符 [a-zA-Z0-9_] |
+ | 1 次或多次 |
* | 0 次或多次 |
{m,n} | m 到 n 次 |
() | 捕獲組,可用 $1 反向引用 |