• 正则表达式从入门到放弃「Java」


    正则表达式能做什么?

    正则表达式可以用来搜索、编辑或处理文本。

    「都懂它可以处理文本,可到底是怎么回事?」

    正则表达式的定义

    百度百科:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    所以正则表达式它「首先不同的语言之间的正则表达式有细微的区别」:

    ^[a-z0-9_-]{3,15}$就是一个标准的正则表达式,它用来检测用户注册登录名时,用户名只可以包含字符、数字、下划线和连接字符并且用户名的长度必须在3-15个字符的范围内。

    1. [...]    方括号内为匹配的规则,a-z 为匹配从 到 的字符,0-9 为匹配 0 到 9 的数字。
    2. {m,n} 正则表达式里的花括号表示:匹配前面的内容至少m次,至多n次,上图中则表示匹配用户名至少3次至多15次,限制了用户名的长度。

    所以上述的正则表达式在实际应用的时候是什么样子的呢?

    Java版本:

    public static void main(String args[]) {
            String UserName = "nicolas";
    
            String pattern = "^[a-z0-9_-]{3,15}$";
            //String pattern = "\w{3,15}";也可以
         boolean isMatch = Pattern.matches(pattern, UserName); System.out.println("用户名是否合规? " + isMatch); }

    输出结果:

    用户名是否合规? true

     正则表达式的实际案例

    看到还不够明白?让我们来看一个应用正则表达式的题目:

    LeetCode NO.38 报数

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

    1.     1
    2.     11
    3.     21
    4.     1211
    5.     111221

    1 被读作  "one 1"  ("一个一") , 即 11。
    11 被读作 "two 1s" ("两个一"), 即 21。
    21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。

    给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

    注意:整数顺序将表示为一个字符串。

    看不懂题目的话请点击本行文字,进入leetcode评论区看一下解释

    首先添加一个Java正则的语法:

    num : 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)1"匹配两个连续的相同字符。

    d : 数字字符匹配。等效于 [0-9]。

    *   : 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。

    那么不难看懂: 「    (d)1*    」的含义为:匹配两个连续0次以上的相同数字

    前文中用到了 :

    Pattern.matches(pattern, UserName);

    Java来做正则表达式的时候 有两个重要的类:Matcher 和 Pattern,下面首先讲一下Matcher 和 Pattern

    Matcher 和 Pattern

    首先介绍一下两个类的主要作用:

    1. Pattern类的实例的主要作用是给正则表达式一个匹配模式,因为在java里面正则表达式是一个字符串,字符串的能力是非常有限的,不像javascript那样可以在正则表达式末尾添加"g" "i" "m"来指定全局匹配、区分大小写匹配和多行匹配(如"/w/gi")。因此在java里面需要Pattern实例来包装正则表达式zifu字符串,然后通过Pattern实例的方法来设置·匹配模式。
    2. Matcher类的实例的作用是增加表达式匹配字符串的权利,让正则表达式更自由的匹配字符串。比如调用Matcher实例的方法,正则表达式可以匹配整个字符串、可以匹配字符串最前端的子串、最后段的子串、或者任意位置的子串等等。

    下面详细介绍几个常用方法:

    Pattern

    • Pattern compile(String regex)
      • 由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表达式编译并赋予给Pattern类。
      • 例如:
      • Pattern pattern = Pattern.compile("\?{2}");
    • Pattern.matcher(CharSequence input)
      • 对指定输入的字符串创建一个Matcher对象。Matcher对象一般通过这个方法生成。CharSequence是个interface,String类实现了CharSequence接口,因此可以传入String类型的值。
      • 例如:
      • Pattern pattern = Pattern.compile("\?{2}");
        Matcher matcher = pattern.matcher("??");
        //matcher的matches方法是对字符串整合匹配。只有整个字符串符合正则表达式才会返回true
        boolean matches = matcher.matches();// true

    Matcher

    • boolean matches()
      • 最常用方法:尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值.
    • boolean lookingAt()
      • 对前面的字符串进行匹配,只有匹配到的字符串在最前面才会返回true
    • boolean find()
      • 对字符串进行匹配,匹配到的字符串可以在任何位置
        • String group()
          • 返回匹配到的子字符串

    这里match()是全匹配正则,但是本次案例里,我们只需要部分匹配就可以了

    find() 部分匹配

    话不多说,我们先看解题代码:

     1 import java.util.regex.Matcher;
     2 import java.util.regex.Pattern;
     3 
     4 public class NO38 {
     5     public String countAndSay(int n) {
     6         StringBuilder sb = new StringBuilder("1");
     7         while(--n>0){
     8             Matcher matcher = Pattern.compile("(\d)\1*").matcher(sb.toString());
     9             sb.setLength(0);//将StringBuffer清空
    10             while(matcher.find()){  //当查找到了相应到字符串
    11                 String num = matcher.group(0);
    12                 sb.append(num.length()+num.substring(0,1));
    13             }
    14         }
    15         return sb.toString();
    16     }
    17 
    18     public static void main(String[] args) {
    19         NO38 solution = new NO38();
    20         String s = solution.countAndSay(5);
    21         System.out.println(s);
    22     }
    23 }

    第8行: 将compile和matcher连用了,其实是可以分开写的,写成:

    1 Pattern p = Pattern.compile("(\d)\1*");
    2 Matcher m = p.matcher(sb.toString);

    第9行: 每次循环开始前要把StringBuffer清空,因为每次都要将上一次的结果清空,比如n=1时,sb=1,那么n=2时需要清空前面的sb值再令sb=11,这个清空sb内容的操作就由第9行代码来完成。

    第10-13行: 前面说到来  find() 是部分匹配,所以写在了while循环内,这样可以在每一次部分匹配成功时,进行一次操作。“matcher.group(0)”是将匹配到的字符串返回,然后获取这个字符串的长度,再进行一次拼接,完成操作

    结束语:

    正则表达式的简单操作就是这样,后面一些进阶的内容待我以后慢慢完善。

    「this page is for my "xxx"」

  • 相关阅读:
    机器学习-第四讲(模型升级)
    AI人脸匹对
    AI换脸
    人脸识别分析小Demo
    动态规划-线性DP&区间DP
    动态规划-背包问题
    数学知识-博弈论
    数学知识-组合数
    数学知识-扩展欧几里得
    数学知识-欧拉函数&快速幂
  • 原文地址:https://www.cnblogs.com/samanian/p/12000579.html
Copyright © 2020-2023  润新知