java正则表达式-String和Regex操作正则表达式

正则表达式知识结构

一、什么是正则表达式

1.何为正则表达式

正则表达式就是一种使用模式匹配规则来实现字符串查找、匹配、替换、分割的技术,主要用来规则匹配和验证等。

2.正则表达式的组成

正则表达式的组成

  • (1)规则表达式:用于匹配的规则

  • (2)模式修饰符:对于规则进行修饰,是一种附加功能

二、正则表达式的规则

正则表达式的规则

基本可以分为两类:

  • 普通字符:没有特殊含义的字符
  • 特殊字符:具有特殊含义的字符,也叫元字符,用来描述规则的字符

三、JAVA中使用正则表达式

java中使用正则表达式

1.使用String类
(1)使用matches方法来匹配
  • 用法:matches(String regex)
  • 参数:
    • regex : 规则字符串
  1. String qqNo = "1020423190";
  2. String email = "ishixinke@qq.com";
  3. boolean isNumber = qqNo.matches("\\d+");
  4. boolean emailCheck = email.matches("\\d+");
  5. System.out.println("qqNo : 是数字吗?"+isNumber); //qqNo : 是数字吗?true
  6. System.out.println("email : 是数字吗?"+emailCheck); //email : 是数字吗?false
(2)使用replaceAll或replaceFirst替换
  • 用法:replaceAll(String regex, String replacement)
  • 参数:
    • regex : 用来匹配的正则规则
    • replacement : 替换后的字符串
  1. String log = "hello1256大45中zb8575Yz89";
  2. System.out.println(log.replaceAll("\\d+", "***")); //hello***大***中zb***Yz***
  3. System.out.println(log.replaceFirst("\\d+", "***")); //hello***大45中zb8575Yz89

注:

  • replaceAll是将所有的匹配的都进行替换
  • replaceFirst只替换一次
(3)使用split进行分割

第一种用法:

  • 用法:split(String regex)
  • 参数:
    • regex : 用来匹配的正则表达式

第二种用法:

  • 用法:split(String regex, int limit)
  • 参数:
    • regex : 用来匹配的正则表达式
    • limit : 限制匹配的次数
  1. String log = "hello1256大45中zb8575Yz89";
  2. String[] blocks = log.split("\\d+");
  3. for (int i = 0; i < blocks.length; i++) {
  4. System.out.print(blocks[i] +","); //["hello","大","中zb","Yz"]
  5. }
  6. System.out.println();
  7. String[] limitBlocks = log.split("\\d+", 3);
  8. for (int i = 0; i < limitBlocks.length; i++) {
  9. System.out.print(limitBlocks[i] +","); //["hello","大","中zb8575Yz89"]
  10. }
2.使用Regex类

Regex类

(1)匹配规则模式对象Pattern
  • compile:按指定规则编译成模式对象
  • matcher : 通过模式对象对目标字符串进行匹配得到匹配对象
  • matches : 判断是否匹配成功
  • split : 按指定模式进行匹配并分割成数组
  1. Pattern pattern = Pattern.compile("\\d+");
  2. String input = "1005";
  3. Matcher m = pattern.matcher(input);
  4. if (m.matches()) {
  5. System.out.println("匹配成功");
  6. } else {
  7. System.out.println("匹配失败");
  8. }
(2)匹配结果对象Matcher
  1. String html = "<ul id=\"navList\">\n" +
  2. "<li><a id=\"blog_nav_sitehome\" class=\"menu\" href=\"https://www.cnblogs.com/\" style=\"width: 70px; font-size: 14px;\">博客园</a></li>\n" +
  3. "<li><a id=\"blog_nav_myhome\" class=\"menu\" href=\"https://www.cnblogs.com/caiyao/\" style=\"width: 66px; font-size: 14px;\">首页</a></li>\n" +
  4. "<li><a id=\"blog_nav_newpost\" class=\"menu\" rel=\"nofollow\" href=\"https://i.cnblogs.com/EditPosts.aspx?opt=1\" style=\"width: 66px;\">新随笔</a></li>\n" +
  5. "<li><a id=\"blog_nav_contact\" class=\"menu\" rel=\"nofollow\" href=\"https://msg.cnblogs.com/send/Birding\" style=\"width: 66px;\">联系</a></li>\n" +
  6. "<li><a id=\"blog_nav_rss\" class=\"menu\" href=\"https://www.cnblogs.com/caiyao/rss\" style=\"width: 66px;\">订阅</a>\n" +
  7. "<li><a id=\"blog_nav_admin\" class=\"menu\" rel=\"nofollow\" href=\"https://i.cnblogs.com/\" style=\"width: 66px;\">管理</a></li>\n" +
  8. "</ul>";
  9. Pattern liPattern = Pattern.compile("<li><a\\s+[^>]+>(.*)</a></li>", Pattern.MULTILINE);
  10. Matcher matcher = liPattern.matcher(html);
  11. while (matcher.find()) {
  12. //0表示整个匹配的内容,1表示第一个分组,即第一个()的地方,是匹配的导航中的内容
  13. System.out.println(matcher.group(1));
  14. }