正则表达式即:用来描述或匹配符合一系列语法规则的某个字符串的单个字符串;
例如:校验QQ号码,校验规则为:非数字0开头,位数为5-15位,所有位全为数字;
下面是非用正则校验代码:
1 public static boolean checkQQ(String s) { 2 boolean flag = true; 3 if(!(s.startsWith("0"))) { 4 if(!(s.length() >= 5 && s.length() <= 15)) { 5 flag = false; 6 } 7 char[] ch = s.toCharArray(); 8 9 for (int i = 0; i < ch.length; i++) { 10 char c = ch[i]; 11 if(!(c >= '0' && c <= '9')) { 12 flag = false; 13 break; 14 } 15 } 16 }else { 17 flag = false; 18 } 19 20 return flag; 21 }
下面是正则校验QQ代码:
1 String regex = "[1-9]\\d{4,14}"; //正则表达式校验QQ号码 2 System.out.println("123456789".matches(regex));
2. 正则校验规则
[]:代表校验单个字符
^:代表非(即相反)
&&:代表取交集
[abc]:代表匹配a或b或c
[^abc]:代表匹配除了abc的其他任意字符
[a-zA-Z]:代表匹配52个大小写字母
[a-z&&[def]]:代表匹配d或e或f(取交集)
. 代表任何单个字符
\d 代表任意单个数字 同[0-9] 反斜杠 \ 需要多加一个反斜杠 \ 进行转义
\D 代表任意单个非数字 同[^0-9]
\s 代表空白字符 同[ \n\r\x0B\t\f]
\S 代表非空白字符
\w 代表单词字符 同[a-zA-Z_0-9]
\W 代表非单词字符
Greedy 数量词
X? X: 一次或一次也没有
X* X: 零次或多次
X+ X: 一次或多次
X{n} X: 恰好n次
X{n,} X: 至少n次
X{n, m} X: 至少n次,但是不超过m次
1 private static void demo5() { 2 String regex = "\\w"; 3 System.out.println("a".matches(regex)); //true 4 System.out.println("%".matches(regex)); //false 5 } 6 7 private static void demo4() { 8 String regex = "\\s"; 9 System.out.println(" ".matches(regex)); 10 System.out.println(" ".matches(regex)); // 一个tab 键 结果为true 11 System.out.println(" ".matches(regex)); // 四个空格 结果为false 12 } 13 14 private static void demo3() { 15 String regex = "\\D"; 16 System.out.println("a".matches(regex)+"123"); 17 } 18 19 private static void demo2() { 20 String regex = "\\d"; 21 System.out.println("1".matches(regex)); 22 } 23 24 private static void demo1() { 25 String regex = "."; 26 System.out.println("a".matches(regex)); 27
1 public static void demo6() { 2 String regex = "[abc]?"; 3 System.out.println("a".matches(regex)); 4 }
1 public static void demo7() { 2 String regex = "[abc]{5}"; //恰好5次 3 System.out.println("abcdb".matches(regex)); //false 4 System.out.println("abcba".matches(regex)); //true 5 }
正则表达式之分割:split(正则表达式) 注意用小数点进行分割的时候,需要用两个反斜杠进行转义才能代表小数点
1 String s = "abc.def.hsg"; 2 String[] arr = s.split("\\."); //NB:这里用点分割时正则表达式的点需要用两个反斜杠进行转义 3 for (int i = 0; i < arr.length; i++) { 4 5 System.out.println(arr[i]); 6 }
正则表达式之替换:replace(regex, replacement)
1 String s = "wo1keyi3de";
2 String regex = "\\d";
3 String str = s.replaceAll(regex, "");
4 System.out.println(str);
正则表达式之分组: ()
1 public static void demo3() { 2 String s = "我...我..我.....爱....学.学..编程..程"; 3 //替换字符串,将字符串替换成"我爱学编程" 4 String str = s.replaceAll("\\.+", ""); 5 String str1 = str.replaceAll("(.)\\1+", "$1"); //$1 代表第一组中的内容 6 System.out.println(str1); 7 } 8 9 public static void demo2() { 10 String s = "abbcdddeggggkhj"; 11 //以叠词分割字符串 12 String regex = "(.)\\1+"; 13 String[] arr = s.split(regex); 14 for (int i = 0; i < arr.length; i++) { 15 System.out.println(arr[i]); 16 } 17 } 18 19 public static void demo1() { 20 String regex = "(.)\\1(.)\\2"; 21 // \\1 代表第一个组再出现一次 \\2 代表第二个组再出现一次 22 System.out.println("aacc".matches(regex)); 23 }
正则表达式之Pettern类:
1 //找出所有的手机号码 2 String s ="我的手机号是13412345678,曾经用过18900000000"; 3 4 String regex = "1[835647]\\d{9}"; 5 Pattern p = Pattern.compile(regex); 6 Matcher m = p.matcher(s); 7 while (m.find()) { 8 System.out.println(m.group()); 9 }