1.正则表达式的概述和简单使用
是指用来描述或匹配字符串是否符合自己的语法规则,其实就是一种规则,有自己特殊用途
比如注册账号时,会限制用户名和密码的长度,这个限制长度就是正则表达式做的
1 /** 2 * B:案例演示 3 * 需求:校验qq号码. 4 * 1:要求必须是5-15位数字 5 * 2:0不能开头 6 * 3:必须都是数字 7 */ 8 9 demo1(); 10 // 正则表达式的匹配规则,用正则表达式实现 11 String regex = "[1-9]\\d{4,14}"; 12 13 System.out.println("0123456".matches(regex)); //false 14 System.out.println("a1234567".matches(regex)); //false 15 System.out.println("930275779".matches(regex)); //true 16 System.out.println(Pattern.matches(regex, "1234567"));//true 17 } 18 19 20 // 用已循环和if语句实现 21 public static void demo1() { 22 System.out.println(checkQQ("012345")); //false 23 System.out.println(checkQQ("930275779")); //true 24 System.out.println(checkQQ("1234567891032489"));//false 25 System.out.println(checkQQ("2346")); //false 26 } 27 public static boolean checkQQ(String s){ 28 boolean flag = true; 29 //限制长度 5~15 之间 30 if(s.length()>=5 && s.length()<=15){ 31 //不能以o开头 32 if(!(s.startsWith("0"))){ 33 // 把字符串转为字符数组 34 char[] chars = s.toCharArray(); 35 //循环录入要判断的字符数组 36 for(int i=0; i<chars.length; i++){ 37 char ch = chars[i]; 38 //输入的数字字符必须是0~9 39 if(!(ch>='0' && ch<='9')){ 40 flag = false; 41 break; 42 } 43 } 44 }else { 45 flag = false; //数字以0开头 46 } 47 }else { 48 flag = false; // 长度不合法 49 } 50 return flag; 51 }
2.字符类演示
/**
* [abc] a、b 或 c(简单类)
* [^abc] 任何字符,除了 a、b 或 c(否定)
* [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
* [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
* [a-z&&[def]] d、e 或 f(交集)
* [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
* [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
*/
1 public static void main(String[] args) { 2 // demo1(); 3 // demo2(); 4 demo3(); 5 // demo4(); 6 // demo5(); 7 // demo6(); 8 } 9 10 public static void demo1() { 11 String regex = "[abc]"; // []表示单个字符 只有abc这几个单个字符可以匹配 12 System.out.println("a".matches(regex)); // true 13 System.out.println("b".matches(regex)); // true 14 System.out.println("++++++++++"); 15 System.out.println("m".matches(regex)); // false 16 System.out.println("n".matches(regex)); // false 17 18 } 19 20 public static void demo2() { 21 String regex = "[^abc]"; //除了abc的单个字符以外,任何单个字符都能满足匹配 22 System.out.println("a".matches(regex)); // false 23 System.out.println("m".matches(regex)); // true 24 System.out.println("sd".matches(regex));//false 是两个字符 25 } 26 27 private static void demo3() { 28 // 取交集,也就是两个范围内,相同的单个字符 "[a-z&&[def]]"也是一样 29 String regex = "[ac&&[dc]]"; 30 System.out.println("a".matches(regex)); 31 System.out.println("c".matches(regex)); 32 System.out.println("%".matches(regex)); // false 33 } 34 35 private static void demo4() { 36 String regex = "[a-d[m-p]]"; //取并集,就是两个范围内的所有单个字符 37 System.out.println("a".matches(regex)); 38 System.out.println("m".matches(regex)); 39 System.out.println("n".matches(regex)); 40 } 41 42 private static void demo6() { 43 String regex = "[a-z&&[^bc]]"; //在a-z的单个字符内,除去 bc 这两个单个字符以外,都匹配 44 System.out.println("a".matches(regex)); 45 System.out.println("b".matches(regex)); 46 System.out.println("1".matches(regex)); 47 }
3.预定义字符类
/**
* 任何字符
* \d 数字:[0-9] ---代表单个的数字字符。 \ 是转义字符
* \D 非数字: [^0-9] ----取反
* \s 空白字符:[ \t\n\x0B\f\r] 代表垂直制表符。f代表翻页dos系统里的,r回车,
* \S 非空白字符:[^\s]
* \w 单词字符:[a-zA-Z_0-9]
* \W 非单词字符:[^\w]
* . 代表任意字符,一个点代表一个字符
*/
1 public static void main(String[] args) { 2 demo1(); 3 demo2(); 4 demo3(); 5 demo4(); 6 demo5(); 7 demo6(); 8 } 9 10 private static void demo6() { 11 // \\W 取反 非单词字符 12 String regex = "\\w"; //单词字符 13 System.out.println("a".matches(regex)); // true 14 System.out.println("z".matches(regex)); // true 15 System.out.println("_".matches(regex)); // true 16 System.out.println("9".matches(regex)); // false 17 } 18 19 private static void demo5() { 20 String regex = "\\S"; // 取反 ,非空白字符 21 System.out.println(" ".matches(regex)); // 空格 false 22 System.out.println(" ".matches(regex)); // tab键 false 23 System.out.println("a".matches(regex)); // true 24 } 25 26 private static void demo4() { 27 String regex = "\\s"; // 匹配空白 28 System.out.println(" ".matches(regex)); //true 29 System.out.println(" ".matches(regex)); // 一个tab键 true 30 System.out.println(" ".matches(regex)); // 四个空格 false 31 } 32 33 private static void demo3() { 34 String regex = "\\D"; // [^0-9]取反,除了数字字符以外都为true 35 System.out.println("0".matches(regex)); // false 36 System.out.println("9".matches(regex)); // false 37 System.out.println("a".matches(regex)); // true 38 } 39 40 private static void demo2() { 41 String regex = "\\d"; // \代表转义字符,如果想表示\d的话,需要\\d 代表[0-9]单个的数字字符, 42 System.out.println("0".matches(regex)); // true 43 System.out.println("a".matches(regex)); // false 44 System.out.println("9".matches(regex)); // true 45 } 46 47 private static void demo1() { 48 String regex = "..";// 点代表任意字符, 一个点代表一个字符,两个点代表两个字符。 49 System.out.println("a".matches(regex)); // f 50 System.out.println("ab".matches(regex)); // t 51 }
4.数量词
* A:Greedy 数量词
* X? X,一次或一次也没有
* X* X,零次或多次
* X+ X,一次或多次
* X{n} X,恰好 n 次
* X{n,} X,至少 n 次
* X{n,m} X,至少 n 次,但是不超过 m 次
1 public static void main(String[] args) { 2 demo1(); 3 demo2(); 4 demo3(); 5 demo4(); 6 demo5(); 7 demo6(); 8 } 9 10 private static void demo6() { 11 String regex = "[abc]{5,15}";//范围内的单个字符出现了至少5次,但不超过15次 12 System.out.println("abcba".matches(regex)); //true 13 System.out.println("abcbaabcabbabab".matches(regex)); //true 14 System.out.println("abcb".matches(regex)); //false 15 System.out.println("abcbaabaabcbaaba".matches(regex)); //false 16 } 17 18 public static void demo5() { 19 String regex = "[abc]{5,}"; //范围内的单个字符至少出现了5次, 20 System.out.println("abcba".matches(regex)); //true 21 System.out.println("abcbaabcabbabab".matches(regex));//true 22 System.out.println("abcb".matches(regex)); //false 23 System.out.println("abcbaaba".matches(regex)); //true 24 } 25 26 public static void demo4() { 27 String regex = "[abc]{5}"; //范围内的单个字符 恰好出现了5次, 28 System.out.println("abcba".matches(regex)); //true 29 System.out.println("abcbaabcabbabab".matches(regex)); //false 30 System.out.println("abcb".matches(regex)); //false 31 System.out.println("abcbaaba".matches(regex)); //false 32 } 33 34 public static void demo3() { 35 String regex = "[abc]+"; //范围内的单个符出现了一次或多次 36 System.out.println("".matches(regex)); //false 一次没出现false 37 System.out.println("a".matches(regex)); //true 38 System.out.println("aaaaabbbbccccc".matches(regex));//true 39 } 40 41 public static void demo2() { 42 String regex = "[abc]*"; // 范围内的单个字符只出现零次或多次 出现一次也正确 43 System.out.println("".matches(regex)); //true 44 System.out.println("abc".matches(regex)); //true 45 System.out.println("a".matches(regex)); //true 46 System.out.println("v".matches(regex)); //false 47 } 48 49 public static void demo1() { 50 String regex = "[abc]?"; // 范围内的单个字符只出现了一次或一次也没有 空的也是true 51 System.out.println("a".matches(regex)); //true 52 System.out.println("b".matches(regex)); //trrue 53 System.out.println("d".matches(regex)); //false 54 System.out.println("".matches(regex)); //true 55 }
5.正则表达式的分割功能
/**
* *A:正则表达式的分割功能
* * String类的功能:public String[] split(String regex)
* Split(“.”).表示任意字符。要转义 \\ .
* * B:案例演示
* * 正则表达式的分割功能
*/
split()是分割方法
1 public static void main(String[] args) { 2 String s = "我们,是,一家人"; 3 String[] arr = s.split(","); 4 for (int i = 0; i < arr.length; i++) { 5 System.out.println(arr[i]); 6 } 7 System.out.println("++++++++++++"); 8 }
//输出结果为 我们
是
一家人
6.把给定字符串中的数字排序
1 String str = “98,99,23”’ 2 int[] arr = new int [str.length]; 5 for(int i = 0 ; i < arr.length; i++){ 6 //把字符串转成数字 7 arr[i] = Integer.parseInt(str.[i]); 8 } 9 //给数字数组排序 10 Arrays.sort(arr);
1 /* 2 * 1.先把空格切分开 3 * 2.再把字符串转成字符数组, 4 * 3.再把字符数组转成int类型, 5 * 4.再用函数进行排序输出 6 */ 7 String str = "23 34 73 45 43"; 8 //转成字符数组 9 String[] arr = str.split(" "); 10 //声明一个长度和str字符数组一样长度的数组 11 int[] arr1 = new int[arr.length]; 12 for (int i = 0; i < arr1.length; i++) { 13 //用函数把字符数组转成int类型的数组 14 arr1[i] = Integer.parseInt(arr[i]); 15 } 16 //用方法把int类型的数组进行排序 17 Arrays.sort(arr1); 18 //再用增强for循环输出 19 for (int i : arr1) { 20 System.out.println(i); 21 } 22 //输出结果为 23 34 43 45 73 23 24 /** 25 * 如果不把字符数组转成int类型的数组,进行排序的话,系统是按照字典顺序取排序的, 26 * 比如在字符串中加入100, 27 * 他的排序会变成 100 23 34 43 45 73 28 */
7.正则表达式的分组和替换功能
(.)\\1
(.)\\1+ 是指匹配多个重复字符
replaceAll(String regex,String replacement); 是替换功能 把括号内前半部分替换成后半部分
1 /* 2 * 分组功能一个点代表匹配一个字符, 3 * \\1代表第一组又出现一次 \\2代表第二次又出新一次 4 */ 5 String regex = "(.)\\1(.)\\2"; 6 System.out.println("快快乐乐".matches(regex)); 7 8 String regex1 = "(..)\\1"; 9 System.out.println("恭喜恭喜".matches(regex1));
1 //创建一个字符串 2 String str = "assssddddddddddesdsssss"; 3 //声明一个规则 4 String regex = "(.)\\1+"; 5 //把字符串转成字符数组,并把规则匹配进去 6 String [] arr = str.split(regex); 7 for (String string : arr) { 8 System.out.println(string); 9 } 10
1 /* 2 * 1.把点去掉,用替换功能replaceAll 3 * 2.再用分组功能吧重复字符去掉,只保留一次 4 */ 5 String str = "我我我我...要..要....要..学学....学编编..编程...程程"; 6 //替换掉点:输出结果为:我我我我要要要学学学编编编程程程 7 String str1 = str.replaceAll("\\.",""); 8 //使用正则表达式只保留一次重复字符 9 String str2 = str1.replaceAll("(.)\\1+","$1");//$1代表第一组中的内容 10 //输出结果为 :我要学编程 11 System.out.println(str2);
8.正则获取功能
pattern类 match类
1 //使用Pattern和Mathcher类实现正则表达式的匹配 2 Pattern p = Pattern.compile("a*b"); 3 Matcher m = p.matcher("aaaaab"); 4 boolean b = m.matches(); 5 System.out.println(b); 6 7 //我们直接使用的是字符串自己的matches方法进行正则表达式的匹配 8 System.out.println("aaab".matches("a*b")); 9 10 11 }