一篇文章搞懂JAVA正则表达式使用

1.java正则表达式的常见写法?
    //比如校验手机号
    第一种:
    String str = "18030577878";
    Pattern p = Pattern.compile("^1[0-9]{10}$");
    Matcher matcher = p.matcher(str);
    System.out.println(matcher.matches());  //返回true

    第二种:
    String str = "18030577878";
    System.out.println(str.matches("^1[0-9]{10}$"));  //返回true

    //找出字符串中的手机号
    String str = "18030577878,,,18030888989";
    Pattern p = Pattern.compile("1[0-9]{10}");
    Matcher matcher = p.matcher(str);
    while (matcher.find()) {
    System.out.println(matcher.group());  //输出 18030577878    18030888989
    }

2.正则表达式中有"^" "$"和没有的区别
    ^ 表示以什么开始  $ 表示以什么结束
    //在校验手机号是
    String str = "18030577878";
    Pattern p = Pattern.compile("^1[0-9]{10}$"); //Pattern p = Pattern.compile("1[0-9]{10}"); 在做校验手机号时并没有什么区别
    Matcher matcher = p.matcher(str);
    System.out.println(matcher.matches());  //返回true

    //在查找字符串中的手机号时  如果加上^ $则匹配字符串的开头和结尾,则无法查找出字符串中的手机号
    String str = "18030577878,,,18030888989";
    Pattern p = Pattern.compile("1[0-9]{10}");
    Matcher matcher = p.matcher(str);
    while (matcher.find()) {
    System.out.println(matcher.group());  //输出 18030577878    18030888989
    }

3.match.group() 和match.group(int a);的区别
    String str = "18030577878";
    Pattern p = Pattern.compile("(1)([0-9]{10})"); //正常情况是这样写的Pattern p = Pattern.compile("1[0-9]{10}");  这里为了分组加上了括号
    Matcher matcher = p.matcher(str);
    while (matcher.find()) {
    System.out.println(matcher.group(0));
    }

    上面程序输出为:18030577878,如果把matcher.group(0)改为matcher.group(1)则输出 1,缓存matcher.group(2)则输出8030577878;
    这里就可以知道group()和group(0)都表示匹配整个正则表达式,group(1)表示匹配第一个括号里面的内容,group(2)表示匹配第二个括号里面的内容

4.贪婪模式与非贪婪模式
    贪婪模式:
     // 要验证的字符串
    String str = "javaweq0000,,java11ea";
    // 编译正则表达式
    Pattern pattern = Pattern.compile("j.*e");
    // 开始匹配
    Matcher matcher = pattern.matcher(str);
    // 查找字符串中是否有匹配正则表达式的字符/字符串
    while (matcher.find()) {
    System.out.println(matcher.group()); //输出javaweq0000,,java11e
    }

    非贪婪模式:
     // 要验证的字符串
    String str = "javaweq0000,,java11ea";
    // 编译正则表达式
    Pattern pattern = Pattern.compile("j.*?e");
    // 开始匹配
    Matcher matcher = pattern.matcher(str);
    // 查找字符串中是否有匹配正则表达式的字符/字符串
    while (matcher.find()) {
    System.out.println(matcher.group());//输出javawe java11e
    }
   
   ps:当"?"字符紧跟在任何一个其他限制符(*, +, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串。

5.单行匹配与多行匹配
    // 要验证的字符串
    String str = "javaweq0000, \n ,java11ea";
    // 编译正则表达式
    //Pattern pattern = Pattern.compile("j.*a"); //返回false
    //Pattern pattern = Pattern.compile("j.*a", Pattern.DOTALL); //返回true
    Pattern pattern = Pattern.compile("(?s)j.*a"); //返回true
    // 开始匹配
    Matcher matcher = pattern.matcher(str);
    System.out.println(matcher.matches());

   String str = "---123\n456---";
    // 单行匹配 - 不会被替换
    System.out.println(str.replaceAll("---.*---", "SUCCESS"));
    输出:---123
      456---

    // 多行匹配 - 匹配并替换
    System.out.println(str.replaceAll("(?s)---.*---", "SUCCESS"));
    输出:SUCCESS

    // 多行匹配 - 另一种方式
    Pattern pattern = Pattern.compile("---.*---", Pattern.DOTALL);
    System.out.println(pattern.matcher(str).replaceAll("SUCCESS"));
    输出:SUCCESS

6.断言正则

 

  ① (?=表达式) 表示匹配该表达式前面的内容,从右边开始找

   .*(?=ing) 可以匹配 “cooking singing” 中的 “cooking sing” 而不是 cook

   ②(?<=表达式)表示匹配表达式后面的内容,从左边开始找

  (?<=abc).* 可以匹配 abcdefg 中的 defg

     ③(?!exp) 表示①的取非(非是与或非的那个非的意思),就是后面跟的不是exp就匹配成功

  ④(?<!exp)表示②取非,就是前面跟的不是exp就匹配成功


7.常用语法api
    *    表示匹配前面的子表达式任意次。
    +    表示匹配前面的子表达式一次或多次。等价于{1,}
    ?    表示匹配前面的子表达式0次或1次。等价于{0,1}

    {n}  表示匹配确定的n次。
    {n,} 表示匹配至少n次。
    {n,m}表示最少匹配n次,最多匹配m次

posted @ 2020-04-06 21:08  Java丨Mr.Chen  阅读(325)  评论(0)    收藏  举报