標籤:blank bcd match exp 輸出 als pre tar 分組
1基礎2.1 簡單字元類
| 構造 |
描述 |
| [abc] |
a,b或c |
| [^abc] |
除a,b或c外的字元 |
| [a-zA-Z] |
a至z 或 A至Z |
| [a-d[m-p]] |
a至d 或 m至p |
| [a-z&&[def]] |
d,e或f |
@Testpublic void testChar() { //匹配 b,c或d assertTrue("d".matches("[bcd]")); //匹配除 a,b,c 以外的字元 (否定) assertTrue("d".matches("[^abc]")); //匹配 a至z 的任一字元 (範圍) assertTrue("d".matches("[a-z]")); //匹配 d,e或f (交集) assertTrue("d".matches("[a-z&&[def]]"));}
2.2 預定義字元類
| 構造 |
描述 |
| . |
任一字元 |
| \d |
一個數字 [0-9] |
| \D |
一個非數字 [^0-9] |
| \s |
空白字元 [ \t\n\x0B\f\r] |
| \S |
非Null 字元 |
| \w |
常規字元 [a-zA-Z_0-9] |
| \W |
非常規字元 |
@Testpublic void testPredef() { //匹配 任一字元 (可能不匹配行終止符) assertTrue("d".matches(".")); //匹配 數字 assertTrue("4".matches("\\d")); //匹配 非數字 assertTrue("d".matches("\\D")); //匹配 空白字元 [ \t\n\x0B\f\r] assertTrue(" ".matches("\\s")); //匹配 非Null 字元 assertTrue("d".matches("\\S")); //匹配 常規字元 [a-zA-Z_0-9] assertTrue("d".matches("\\w")); //匹配 非常規字元 assertTrue("!".matches("\\W"));}
2.3 量詞
| 貪心 |
勉強 |
描述 |
| X? |
X?? |
X出現一次或沒有 |
| X* |
X*? |
X出現零次或多次 |
| X+ |
X+? |
X出現一次或多次 |
| X{n} |
X{n}? |
X出現n次 |
| X{n,} |
X{n,}? |
X出現至少n次 |
| X{n,m} |
X{n,m}? |
X出現至少n次,至多m次 |
@Testpublic void testQuant() { // * 表示出現0次或多次 (貪心,最大匹配) assertEquals("<b>d<b>".replaceAll("<.*>","#"),"#"); // * 表示出現0次或多次,? 表示最小匹配 assertEquals("<b>d<b>".replaceAll("<.*?>","#"),"#d#"); // + 表示出現1次或多次 (貪心,最大匹配) assertEquals("<b>d<b>".replaceAll("<.+>","#"),"#"); // * 表示出現1次或多次,? 表示最小匹配 assertEquals("<b>d<b>".replaceAll("<.+?>","#"),"#d#"); // {1} 表示出現1次 assertEquals("<b>d<b>".replaceAll("<.{1}>","#"),"#d#"); // {1,} 表示出現1次至多次 assertEquals("<b>d<b>".replaceAll("<.{1,}>","#"),"#"); // {1,8} 表示出現1次至8次 assertEquals("<b>d<b>".replaceAll("<.{1,8}>","#"),"#");}
2.4 分組
@Testpublic void testGroup() { // () 表示分組,?表示出現0次或1次,\\d\\d表示兩個數字 assertFalse("du2".matches("du(\\d\\d)?")); // 匹配 assertTrue("du12".matches("du(\\d\\d)?")); // 不匹配,分組條件出現了2次 assertFalse("du1212".matches("du(\\d\\d)?")); // 匹配 assertTrue("du1212".matches("du(\\d\\d)+"));}
2.5 邊界匹配
| 邊界構造 |
描述 |
| ^ |
行開始 |
| $ |
行結尾 |
| \b |
單詞邊界 |
| \B |
非單詞邊界 |
| \A |
輸入開始 |
| \z |
輸入結尾 |
@Testpublic void testBound() { // ^ 行開始 assertTrue("42du".matches("^(\\d\\d)du")); // $ 行結尾 assertTrue("42du".matches("\\d\\d(du)$")); // \\b 表示單詞邊界 assertTrue("a dog".matches(".*\\bdog\\b")); // \\B 表示非單詞邊界 assertTrue("a doggie".matches(".*\\bdog\\B.*"));}
2.6 Pattern和Matcher基本
import java.util.regex.Matcher;import java.util.regex.Pattern;public class MatcherDemo { public static void main(String[] args){ // 不區分大小寫 Pattern pattern = Pattern.compile("\\bdog\\B",Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher("The Doggie plays"); while (matcher.find()) { System.out.println(matcher.group()); System.out.println(matcher.start()); System.out.println(matcher.end()); } }}
輸出
Dog47
3 樣本3.1 使用者名稱正則
/** ^ 開頭* [a-z0-9_-] 匹配a-z,0-9,底線,中線* {4,10} 長度4至10* $ 結尾*/String unReg = "^[a-z0-9_-]{4,10}$";
3.2 顏色正則
/** ^ 開頭* # "#" 符號* ( 開始分組* [A-Fa-f0-9]{6} 長度為6的字母數字* | 或* [A-Fa-f0-9]{3} 長度為3的字母數字* ) 分組結束* $ 結尾*/String coReg = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
3.3 24時制時間
/* * ( 分組開始 * [01]?[0-9] 0-9,00-09,10-19 * | 或 * 2[0-3] 20-23 * ) 分組結束 * : :符號 * [0-5][0-9] 00 至 59 */String tiReg = "([01]?[0-9]|2[0-3]):[0-5][0-9]";
4 結語
本文簡要介紹了javaRegex的最基礎的知識內容,並給出了簡單實用的小例子來理解消化所學內容。要想熟練掌握這些基礎知識,還要動手多加以練習,閱讀官方文檔。javaRegex的進階的內容我會在下一篇文章裡進行介紹。
推薦javaRegex學習的一些資料:
官方:docs.oracle.com
英文:vogella.com
中文:runoob.com
javaRegex基礎知識(轉)