java正则表达式笔记

1、正则表达式的概述和简单使用

  • A:正则表达式
    • 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
    • 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的

作用:专门用于操作字符串
                特点:用一些特定的符号来表示一些代码的操作.这样就简化书写.

所以学正则表达式,就是学习一些特殊符号的使用.

好处:可以简化对字符串的操作

弊端:符号定义越多,正则越长,阅读性越差

  • B:案例演示
    • 需求:校验qq号码.
      • 1: 要求必须是5-15位数字
      • 2: 0不能开头
      • 3: 必须都是数字
    • a:非正则表达式实现
    • b:正则表达式实现

案例:

  1. package com.zxy.regex;
  2. public class Demo1_Regex {
  3. public static void main(String[] args) {
  4. System.out.println(checkQQ("012345"));
  5. System.out.println(checkQQ("a1b345"));
  6. System.out.println(checkQQ("123456"));
  7. System.out.println(checkQQ("1234567890987654321"));
  8. String regex = "[1-9]\\d{4,14}";
  9. System.out.println("2553868".matches(regex));
  10. System.out.println("012345".matches(regex));
  11. System.out.println("2553868abc".matches(regex));
  12. }
  13. /*
  14. * 需求:校验qq号码.
  15. * 1:要求必须是5-15位数字
  16. * 2:0不能开头
  17. * 3:必须都是数字
  18. * 校验qq
  19. * 1,明确返回值类型boolean
  20. * 2,明确参数列表String qq
  21. */
  22. public static boolean checkQQ(String qq) {
  23. boolean flag = true; //如果校验qq不符合要求就把flag置为false,如果符合要求直接返回
  24. if(qq.length() >= 5 && qq.length() <= 15) {
  25. if(!qq.startsWith("0")) {
  26. char[] arr = qq.toCharArray(); //将字符串转换成字符数组
  27. for (int i = 0; i < arr.length; i++) {
  28. char ch = arr[i]; //记录每一个字符
  29. if(!(ch >= ‘0‘ && ch <= ‘9‘)) {
  30. flag = false; //不是数字
  31. break;
  32. }
  33. }
  34. }else {
  35. flag = false; //以0开头,不符合qq标准
  36. }
  37. }else {
  38. flag = false; //长度不符合
  39. }
  40. return flag;
  41. }
  42. }

2、字符类演示

  • A:字符类(在java.util.regex包中的Pattern类中)
    • [abc]               a、b 或 c(简单类)
    • [^abc]             任何字符,除了 a、b 或 c(否定)
    • [a-zA-Z]          a到 z 或 A到 Z,两头的字母包括在内(范围)
    • [0-9]                0到9的字符都包括

案例:

  1. package com.zxy.regex;
  2. public class Demo2_Regex {
  3. /**
  4. * [abc] a、b 或 c(简单类)
  5. [^abc] 任何字符,除了 a、b 或 c(否定)
  6. [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
  7. [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
  8. [a-z&&[def]] d、e 或 f(交集)
  9. [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
  10. [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
  11. */
  12. public static void main(String[] args) {
  13. //demo1();
  14. //demo2();
  15. //demo3();
  16. //demo4();
  17. //demo5();
  18. //demo6();
  19. demo7();
  20. }
  21. private static void demo7() {
  22. String regex = "[a-z&&[^m-p]]";//a-z,除了m-p
  23. System.out.println("m".matches(regex));
  24. System.out.println("a".matches(regex));
  25. System.out.println("z".matches(regex));
  26. System.out.println("n".matches(regex));
  27. }
  28. private static void demo6() {
  29. String regex = "[a-z&&[^bc]]";
  30. System.out.println("a".matches(regex));
  31. System.out.println("b".matches(regex));
  32. System.out.println("1".matches(regex));
  33. }
  34. private static void demo5() {
  35. String regex = "[a-z&&[def]]"; //取交集
  36. System.out.println("a".matches(regex));
  37. System.out.println("d".matches(regex));
  38. }
  39. private static void demo4() {
  40. String regex = "[a-d[m-p]]";
  41. System.out.println("a".matches(regex));
  42. System.out.println("m".matches(regex));
  43. System.out.println("n".matches(regex));
  44. }
  45. private static void demo3() {
  46. String regex = "[a-zA-Z]";
  47. System.out.println("a".matches(regex));
  48. System.out.println("A".matches(regex));
  49. System.out.println("z".matches(regex));
  50. System.out.println("Z".matches(regex));
  51. System.out.println("1".matches(regex));
  52. System.out.println("%".matches(regex));
  53. }
  54. private static void demo2() {
  55. String regex = "[^abc]";
  56. System.out.println("a".matches(regex));
  57. System.out.println("b".matches(regex));
  58. System.out.println("c".matches(regex));
  59. System.out.println("d".matches(regex));
  60. System.out.println("1".matches(regex));
  61. System.out.println("%".matches(regex));
  62. System.out.println("10".matches(regex)); //10代表1字符和0字符,不是单个字符
  63. }
  64. private static void demo1() {
  65. String regex = "[abc]"; //[]代表单个字符
  66. System.out.println("a".matches(regex));
  67. System.out.println("b".matches(regex));
  68. System.out.println("c".matches(regex));
  69. System.out.println("d".matches(regex));
  70. System.out.println("1".matches(regex));
  71. System.out.println("%".matches(regex));
  72. }
  73. }

3、预定义字符类演示

  • A:预定义字符类
    • .       任何字符(一个,两个点代表任意两个字符)
    • \d      数字:[0-9]
    • \w     单词字符:[a-zA-Z_0-9]

案例:

  1. package com.zxy.regex;
  2. public class Demo3_Regex {
  3. /**
  4. * . 任何字符
  5. \d 数字:[0-9]
  6. \D 非数字: [^0-9]
  7. \s 空白字符:[ \t\n\x0B\f\r] //空格,\t:制表符,\n:换行,\x0B:垂直制表符,\f:翻页,\r:回车
  8. \S 非空白字符:[^\s]
  9. \w 单词字符:[a-zA-Z_0-9]
  10. \W 非单词字符:[^\w]
  11. */
  12. public static void main(String[] args) {
  13. //demo1();
  14. //demo2();
  15. //demo3();
  16. //demo4();
  17. //demo5();
  18. //demo6();
  19. //demo7();
  20. System.out.println("\\");//要打印出\,并需再加一个\进行转义
  21. }
  22. private static void demo7() {
  23. String regex = "\\W";
  24. System.out.println("a".matches(regex));
  25. System.out.println("z".matches(regex));
  26. System.out.println("_".matches(regex));
  27. System.out.println("%".matches(regex));
  28. }
  29. private static void demo6() {
  30. String regex = "\\w";
  31. System.out.println("a".matches(regex));
  32. System.out.println("z".matches(regex));
  33. System.out.println("_".matches(regex));
  34. System.out.println("%".matches(regex));
  35. }
  36. private static void demo5() {
  37. String regex = "\\S";
  38. System.out.println(" ".matches(regex));
  39. System.out.println(" ".matches(regex));
  40. System.out.println("a".matches(regex));
  41. }
  42. private static void demo4() {
  43. String regex = "\\s";
  44. System.out.println(" ".matches(regex));
  45. System.out.println(" ".matches(regex)); //一个tab键
  46. System.out.println(" ".matches(regex)); //四个空格
  47. }
  48. private static void demo3() {
  49. String regex = "\\D";                                  //\D表示非字符
  50. System.out.println("0".matches(regex));
  51. System.out.println("9".matches(regex));
  52. System.out.println("a".matches(regex));
  53. }
  54. private static void demo2() {
  55. String regex = "\\d"; //\代表转义字符,如果想表示\d的话,需要\\d
  56. System.out.println("0".matches(regex));
  57. System.out.println("a".matches(regex));
  58. System.out.println("9".matches(regex));
  59. }
  60. private static void demo1() {
  61. String regex = "..";
  62. System.out.println("a".matches(regex));
  63. System.out.println("ab".matches(regex));
  64. }
  65. }

4、数量词

  • A:Greedy 数量词
    • X?                 X,一次或一次也没有
    • X*                   X,零次或多次
    • X+                  X,一次或多次
    • X{n}               X,恰好 n 次
    • X{n,}              X,至少 n 次
    • X{n,m}           X,至少 n 次,但是不超过 m 次

案例:

  1. package com.zxy.regex;
  2. public class Demo4_Regex {
  3. /**
  4. * Greedy 数量词
  5. X?         X,一次或一次也没有
  6. X*         X,零次或多次
  7. X+         X,一次或多次
  8. X{n}     X,恰好 n 次
  9. X{n,}      X,至少 n 次
  10. X{n,m}     X,至少 n 次,但是不超过 m 次
  11. */
  12. public static void main(String[] args) {
  13. //demo1();
  14. //demo2();
  15. //demo3();
  16. //demo4();
  17. //demo5();
  18. //demo6();
  19. }
  20. private static void demo6() {
  21. String regex = "[abc]{5,15}";
  22. System.out.println("abcba".matches(regex));
  23. System.out.println("abcbaabcabbabab".matches(regex));
  24. System.out.println("abcb".matches(regex));
  25. System.out.println("abcbaabaabcbaaba".matches(regex));
  26. }
  27. public static void demo5() {
  28. String regex = "[abc]{5,}";//>=5次
  29. System.out.println("abcba".matches(regex));
  30. System.out.println("abcbaabcabbabab".matches(regex));
  31. System.out.println("abcb".matches(regex));
  32. System.out.println("abcbaaba".matches(regex));
  33. }
  34. public static void demo4() {
  35. String regex = "[abc]{5}";
  36. System.out.println("abcba".matches(regex));
  37. System.out.println("abcbaabcabbabab".matches(regex));
  38. System.out.println("abcb".matches(regex));
  39. System.out.println("abcbaaba".matches(regex));
  40. }
  41. public static void demo3() {
  42. String regex = "[abc]+";
  43. System.out.println("".matches(regex));
  44. System.out.println("a".matches(regex));
  45. System.out.println("aaaaabbbbccccc".matches(regex));
  46. }
  47. public static void demo2() {
  48. String regex = "[abc]*";
  49. System.out.println("".matches(regex));
  50. System.out.println("abc".matches(regex));
  51. System.out.println("a".matches(regex));
  52. System.out.println("aaaa".matches(regex));
  53. }
  54. public static void demo1() {
  55. String regex = "[abc]?";
  56. System.out.println("a".matches(regex));
  57. System.out.println("b".matches(regex));
  58. System.out.println("c".matches(regex));
  59. System.out.println("d".matches(regex));
  60. System.out.println("".matches(regex));
  61. }
  62. }

5、正则表达式的分割功能

  • A:正则表达式的分割功能
    • String类的功能:public String[] split(String regex)
  • B:案例演示
    • 正则表达式的分割功能

案例:

  1. package com.zxy.regex;
  2. public class Demo5_Split {
  3. public static void main(String[] args) {
  4. //演示时先按照空格切割
  5. //再按点(.)切割,但是点(.)在正则表达式中代表任意字符,它具有特殊的含义
  6. //所以需要将点进行转义前面加\,但是要想表示出一个\,需要在前面再加一个\,
  7. //这样就成了\\.
  8. String s = "金三胖.郭美美.李dayone";
  9. String[] arr = s.split("\\."); //通过正则表达式切割字符串
  10. for (int i = 0; i < arr.length; i++) {
  11. System.out.println(arr[i]);
  12. }
  13. System.out.println("11111111111111111");
  14. }
  15. }

6、把给定字符串中的数字排序

  • A:案例演示
    • 需求:我有如下一个字符串:”91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”

案例:

  1. package com.zxy.test;
  2. import java.util.Arrays;
  3. public class Test1 {
  4. /**
  5. * 分析:
  6. * 1,将字符串切割成字符串数组
  7. * 2,将字符串转换成数字并将其存储在一个等长度的int数组中
  8. * 3,排序
  9. * 4,将排序后的结果遍历并拼接成一个字符串
  10. */
  11. public static void main(String[] args) {
  12. String s = "91 27 46 38 50";
  13. //1,将字符串切割成字符串数组
  14. String[] sArr = s.split(" ");
  15. //2,将字符串转换成数字并将其存储在一个等长度的int数组中
  16. int[] arr = new int[sArr.length];
  17. for (int i = 0; i < arr.length; i++) {
  18. arr[i] = Integer.parseInt(sArr[i]); //将数字字符串转换成数字
  19. }
  20. //3,排序
  21. Arrays.sort(arr);
  22. //4,将排序后的结果遍历并拼接成一个字符串27 38 46 50 91
  23. /*String str = "";
  24. for (int i = 0; i < arr.length; i++) {
  25. if(i == arr.length - 1) {
  26. str = str + arr[i]; //27 38 46 50 91
  27. }else {
  28. str = str + arr[i] + " "; //27 38 46 50
  29. }
  30. }
  31. System.out.println(str);*/
  32. StringBuilder sb = new StringBuilder();
  33. for (int i = 0; i < arr.length; i++) {
  34. if(i == arr.length - 1) {
  35. sb.append(arr[i]);
  36. }else {
  37. sb.append(arr[i] + " ");
  38. }
  39. }
  40. System.out.println(sb);
  41. }
  42. }

7、正则表达式的替换功能

  • A:正则表达式的替换功能
    • String类的功能:public String replaceAll(String regex,String replacement)
  • B:案例演示
    • 正则表达式的替换功能

案例:

  1. package com.zxy.regex;
  2. public class Demo6_ReplaceAll {
  3. public static void main(String[] args) {
  4. String s = "wo111ai222zxy";
  5. String regex = "\\d"; //\\d代表的是任意数字
  6. String s2 = s.replaceAll(regex, "");
  7. System.out.println(s2);
  8. }
  9. }

8、正则表达式的分组功能

  • A:正则表达式的分组功能
    • 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1     ((A)(B(C)))

2     (A

3     (B(C))

4     (C)

组零始终代表整个表达式。

  • B:案例演示

a:切割

需求:请按照叠词切割: "sdqqfgkkkhjppppkl";

b:替换

需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程

将字符串还原成:“我要学编程”。

(.)\\1+的含义:    表示第二个位置和(.)一样,但是第二个位置出现了1次或多次

第一个字符是任意字符,但是第二位和第一位相同,即第二位用第一位的结果,

所以将第一位的点(.)用括号()括起来(将要重用的部分用括号括起来,叫组),

每组都有一个编号(从第一组开始)

(.)通过"\"形式反向引用前面的组,\\1表示第一组的内容在\\1重新出现,可以1次或多次

案例:

  1. package com.zxy.regex;
  2. public class Demo7_Regex {
  3. public static void main(String[] args) {
  4. //demo1();
  5. demo2();
  6. //demo3();
  7. }
  8. private static void demo3() {
  9. /*
  10. * 需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
  11. 将字符串还原成:“我要学编程”。
  12. */
  13. String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
  14. String s2 = s.replaceAll("\\.+", "");
  15. String s3 = s2.replaceAll("(.)\\1+", "$1"); //$1代表第一组中的内容
  16. System.out.println(s3);
  17. }
  18. public static void demo2() {
  19. //需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
  20. String s = "sdqqfgkkkhjppppkl";
  21. //String regex = "(.)\\1";
  22. String regex = "(.)\\1+"; //+代表第一组出现一次到多次
  23. String[] arr = s.split(regex);
  24. for (int i = 0; i < arr.length; i++) {
  25. System.out.println(arr[i]);
  26. }
  27. System.out.println("---------------");
  28. }
  29. public static void demo1() {
  30. //叠词 快快乐乐,高高兴兴
  31. /*String regex = "(.)\\1(.)\\2"; //\\1代表第一组又出现一次 \\2代表第二组又出现一次
  32. System.out.println("快快乐乐".matches(regex));
  33. System.out.println("快乐乐乐".matches(regex));
  34. System.out.println("高高兴兴".matches(regex));
  35. System.out.println("死啦死啦".matches(regex));*/
  36. //叠词 死啦死啦,高兴高兴
  37. String regex2 = "(..)\\1";//第一组有两个字符,然后让第一组再出现一次
  38. System.out.println("死啦死啦".matches(regex2));
  39. System.out.println("高兴高兴".matches(regex2));
  40. System.out.println("快快乐乐".matches(regex2));
  41. }
  42. }

9、Pattern和Matcher的概述

  • A:Pattern和Matcher的概述
  • B:模式和匹配器的典型调用顺序
    • 通过JDK提供的API,查看Pattern类的说明

典型的调用顺序是

      • Pattern p = Pattern.compile("a*b");
      • Matcher m = p.matcher("aaaaab");
      • boolean b = m.matches();

案例:

  1. package com.zxy.regex;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class Demo8_Pattern {
  5. public static void main(String[] args) {
  6. demo1();
  7. }
  8. public static void demo1() {
  9. //"a*b":表示a出现的是0次或多次,后面跟一个b
  10. Pattern p = Pattern.compile("a*b"); //获取到正则表达式
  11. Matcher m = p.matcher("aaaaab"); //获取匹配器
  12. boolean b = m.matches(); //看是否能匹配,匹配就返回true
  13. System.out.println(b);
  14. System.out.println("aaaaab".matches("a*b")); //与上面的结果一样
  15. }
  16. }

10、正则表达式的获取功能

  • A:正则表达式的获取功能
    • Pattern和Matcher的结合使用
  • B:案例演示
    • 需求:把一个字符串中的手机号码获取出来

案例:

  1. package com.zxy.regex;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class Demo8_Pattern {
  5. public static void main(String[] args) {
  6. //demo1();
  7. //demo2();
  8. demo3();
  9. }
  10. //匹配查找邮箱
  11. private static void demo3() {//[1][\\d&&[012678]][\\d]{9}
  12. String s = "我的邮箱是[email protected],我曾经用过[email protected],我还用过[email protected]";
  13. //String regex = "[a-zA-Z0-9_][email protected][a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
  14. String regex = "\\[email protected]\\w+(\\.\\w+)+";
  15. Pattern p = Pattern.compile(regex);
  16. Matcher matcher = p.matcher(s);
  17. while(matcher.find()){
  18. System.out.println(matcher.group());
  19. }
  20. }
  21. //匹配查找手机号
  22. private static void demo2() {
  23. String s = "我的手机是18511866260,我曾用过18987654321,还用过18812345678";
  24. String regex = "1[3578]\\d{9}";
  25. Pattern p = Pattern.compile(regex);
  26. Matcher m = p.matcher(s);
  27. /*boolean b1 = m.find();
  28. System.out.println(b1);
  29. System.out.println(m.group());
  30. boolean b2 = m.find();
  31. System.out.println(b2);
  32. System.out.println(m.group());*/
  33. while(m.find())
  34. System.out.println(m.group());
  35. }
  36. }
时间: 2024-08-11 03:31:09

java正则表达式笔记的相关文章

JavaSE学习笔记21:Java正则表达式

Java正则表达式   1.正则表达式(特点) 正则表达式,顾名思义,就是符合一定规则的表达式.作用是专门用于操作字符串,虽说String类中已经有了很多操作字符串的方法,但是它们的功能单一,操作起来还麻烦,正则弥补了它们的补足. 下面我们通过一个小例子来感受一下区别: 需求:对QQ号码进行校验,要求:5~15位,0不能开头,只能是数字. (1)常规的做法: class CheckQQ { public static void main(String[] args) { String qq="3

Java学习笔记21(String类补充:正则表达式)

正如python的re模块,不过Java和Python的正则表达式有一些区别,这里做简单介绍,具体的细节可以参考网上其他的文章: 功能:可以用于检验一个字符串,比如验证用户名,验证密码格式,验证是否是邮箱,等等 示例: "[0-9]{6,12}"匹配规则:6到12位的数字,比如123456789就是true,12345就是false "1[3578][0-9]{9}"匹配规则:1开头,第二位是3578中的一个,后面九个任意数字,比如13345678912就是true

Java自学笔记(三)——输入

因为最近学的内容实际操作比较多,所以新的笔记就用代码为主体吧! 本回主要内容是输入,Java中主要用Scanner类和BufferedReader.总体来说不难,但有些细节可以总结,看代码: import java.io.*; import java.util.Scanner; public class ioTest { public static void main(String[] args) throws Exception { //Scanner提供了多种构造器,不同的构造器可以接受文件

Java 学习笔记(2015.7.20~24)

Java 学习笔记(2015.7.20~24) Java Java 学习笔记(2015.7.20~24) 1.StringBuffer与StringBuilder的区别: 2.基本数据类型包装类 3.Date.Calendar.DateFormat等与时间相关的类 1.常用类String 2.正则表达式 3.常用类 StringBuffer 代表可变的字符序列 拆箱与装箱 包装类的应用 匿名内部类 数组 day11 day12 day13 day14 day11 父类中使用public定义的方法

Java 正则表达式详解_正则表达式

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}

【Java学习笔记】几个实用类

作者:gnuhpc     出处:http://www.cnblogs.com/gnuhpc/ 1.File类为管理文件和目录提供了方法,其对象表示一个文件或者目录.它提供了若干方法对文件或文件夹进行操作.其中的list()方法和listFiles()方法可以起到定位特定文件的作用. 2.Object类,是所有Java类的祖先,若一个类声明时没有包含extends关键字,则其直接继承于Objetc类.其中有许多重要方法: equals(),notify(),notifyAll(),wait(),

Java学习笔记_19_String类

19.String类: 1>String类的构造方法: · 利用字符串构造一个字符串对象: String str = "HelloWorld": · 无参构造一个字符串对象: String str = new String(); · 传递参数生成一个字符串对象: String str = new String("HelloWorld"); · 由字符数组生成一个字符串对象: String str = new String(char s[ ]); · 由字符数组

JAVA正则表达式:Pattern类与Matcher类详解(转)

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

Java系列笔记(1) - Java 类加载与初始化

目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JVM使用类加载器(Class Loader)来加载类的字节码文件(.class),类加载器实质上是一条类加载器链,一般的,我们只会用到一个原生的类加载器,它只加载Java API等可信类,通常只是在本地磁盘中加载,这些类一般就够我们使用了.如果我们需要从远