正则表达式经典应用

2022-05-17 11:44:46 浏览数 (1)

前言

大家好,我是熊哥。在项目开发中,经常会用到正则表达式,它在检索、替换符合某个模式(规则)的文本中起到举足轻重的作用。

本文以两个例子来介绍 Java 中,常用到的正则表达式,供大家参考,希望对大家有所帮助。

判断输入的时间是否符合格式要求一

代码语言:javascript复制
判断用户输入的时间的格式(非区间内)是否符合要求。

要求:
1、时间是 24 小时制;
2、时间的格式是:xx:xx:xx;
3、当分秒不足 10 时,前面补 0;
4、冒号是英文格式,且冒号与数字之间不能有空格

示例:
输入:str = "8:2:30"
输出:false
解释:因为 2 < 10,所以应当输入 02 而不是 2,
同时冒号为英文格式。

思路

时间是 24 小时制,当分秒不足 10 时,前面补 0

如果时钟小于 20,则时钟的第二位只能是 0~9,例如:下午三点就写成 15;

如果时钟不小于 20,则时钟的第二位只能是 0~3,例如:晚上十点就写成 22;

对于分钟和秒钟第一、二位分别只能是 0~5 和 0~9,例如:四十五分二十一秒就写成 45:21,八分两秒应写成 08:02。

正则表达式

代码语言:javascript复制
"([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]"

解释:
([01]?[0-9]|2[0-3]):如果时钟是 0 或 1 开头,
则时钟的第二位只能是 0~9;
否则时钟的第二位是 0~3;

[0-5][0-9]:分钟或者秒钟以 0~5 开头,
第二位只能是 0~9。

Show me the Code

Java

代码语言:javascript复制
public static boolean isValidTime(String str) {
    String format = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";
    Pattern pattern = Pattern.compile(format);
    Matcher matcher = pattern.matcher(str);
    if (matcher.matches()) {
        return true;
    }
    return false;
}

判断输入的时间是否符合格式要求二

代码语言:javascript复制
判断用户输入的时间的格式(区间外)是否符合要求。

要求:
1、同上面例一的要求;
2、两个时间之间有英文逗号且不能有空格;
3、中括号是英文版的。

示例:
输入:str = "[8:20:30,12:32:5]"
输出:false
解释:因为 5 < 10,所以应当输入 05 而不是 5,
同时冒号为英文格式。

思路

  1. 判断格式是否是以左中括号打头,以右中括号结尾,即是否满足[];
  2. 若 1 满足后,提取中括号中的字符串;
  3. 将中括号中的字符串按照逗号进行切分;
  4. 判断每个被切分的部分是否满足要求

正则表达式

代码语言:javascript复制
"(\[(.*?)])":判断格式是否是 [];
"\[(.*?)]":提取中括号中的字符;
split(","):按照逗号对字符串进行切分;
"([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]":判断被切分的部分是否满足要求。

Show me the Code

Java

代码语言:javascript复制
public static boolean isValidTimeInside(String str) {
    String format = "(\[(.*?)])";

    // 匹配字符串的格式是否是英文版的[]
    Pattern pattern = Pattern.compile(format);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        // 获取 [] 中的内容
        String regex = "\[(.*?)]";
        Pattern compile = Pattern.compile(regex);
        Matcher matcher1 = compile.matcher(str);
        while (matcher1.find()) {
            // 将 [] 中文内容按逗号切分 
            String[] strings = matcher1.group(1).split(",");
            for (String string : strings) {
                // 判断切分后的每部分是否满足要求
                if (!isValidTime(string)) {
                    return false;
                }
            }
        }
        return true;
    }
    return false;
}

0 人点赞