个人常用的正则表达式匹配,以及实际应用

大家好,我是【八戒,你又涨价了哎】

以下是我个人在 实习过程 中的分享,请大家多多指教

目录

一、个人常用匹配规则

1. 元字符

2. 量词

3. 字符类

4. 边界匹配

5. 转义字符

6. 非贪婪模式

7. 常用举例

1. 匹配数字

2. 匹配字母

二、个人常用匹配 以及 实际应用

1、匹配邮箱

2、匹配Ipv4地址

3、匹配url

4、匹配手机号

5、匹配身份证号

6、匹配是否为一维整型数组,例如:[1, 2, 3]

7、匹配是否为二维整型数组,例如:[[1], [2, 3], [-4, 5]]

8、匹配是否为二维字符串数组,例如:[[ "apple" ], [ "banana", "cherry" ]]

9、匹配是否为二维字符串数组【2】,例如: [['hello', 'world'], ['foo', 'bar']]

10、将字符 串形式的二维字符数组 转化为 二维字符数组类型:

11、将字符 串形式的二维整型数组 转化为 二维整型数组类型:

12、将字符 串形式的二维整型数组 转化为 二维整型List集合(类似11,仅修改收集方式):

13、将字符 串形式的二维整型数组 转化为 二维字符串数组类型: 

14、将 双精度浮点数转 化为 整数(有小数保留1位小数,若5.0保留5)


一、个人常用匹配规则

1. 元字符

元字符在正则表达式中有特殊的含义,用来控制匹配行为。常见的元字符包括:

  • .(点号):
    匹配任意字符,除了换行符。
    例子:a.b 可以匹配 aabacb 等。

  • ^(脱字符):
    表示字符串的开头。
    例子:^abc 只能匹配以 abc 开头的字符串。

  • $(美元符号):
    表示字符串的结尾。
    例子:xyz$ 只能匹配以 xyz 结尾的字符串。

  • [](字符类):
    匹配字符集合中的任意一个字符。
    例子:[abc] 可以匹配 abc 中的任意一个字符。

  • |(或运算符):
    表示或操作,匹配左侧或右侧的表达式。
    例子:abc|def 可以匹配 abcdef

  • ()(捕获组):
    用来分组,可以将多个字符组合成一个整体。
    例子:(abc)+ 表示 abc 可以重复一次或多次。

2. 量词

量词用于指定匹配的次数:

  • *
    匹配前面的表达式 0 次或多次。
    例子:a* 可以匹配空字符串、aaa 等。

  • +
    匹配前面的表达式 1 次或多次。
    例子:a+ 可以匹配 aaa 等,但不能匹配空字符串。

  • ?
    匹配前面的表达式 0 次或 1 次。
    例子:a? 可以匹配空字符串或 a

  • {n}
    匹配前面的表达式恰好 n 次。
    例子:a{3} 只能匹配 aaa

  • {n,}
    匹配前面的表达式至少 n 次。
    例子:a{2,} 可以匹配 aaaaa 等。

  • {n,m}
    匹配前面的表达式至少 n 次,至多 m 次。
    例子:a{2,4} 可以匹配 aaaaaaaaa

3. 字符类

字符类用于定义一组字符,可以在方括号内列出可能的字符:

  • [abc]
    匹配 abc 中的任意一个字符。

  • [a-z]
    匹配小写字母 a 到 z。

  • [^abc]
    匹配除 abc 之外的任意字符。

  • \d
    匹配任意数字,等同于 [0-9]

  • \D
    匹配非数字字符。

  • \w
    匹配任意字母、数字或下划线字符,等同于 [a-zA-Z0-9_]

  • \W
    匹配非字母、非数字或非下划线字符。

  • \s
    匹配任意空白字符(空格、制表符、换行符等)。

  • \S
    匹配非空白字符。

4. 边界匹配

边界匹配器用于匹配特定的字符串位置,而不是具体的字符:

  • ^
    匹配字符串的开头。
    例子:^Hello 只能匹配以 Hello 开头的字符串。

  • $
    匹配字符串的结尾。
    例子:world$ 只能匹配以 world 结尾的字符串。

  • \b
    匹配单词边界。
    例子:\bword\b 只能匹配完整的 word,而不是 swordwording

  • \B
    匹配非单词边界。

5. 转义字符

如果要匹配元字符本身而不是它们的特殊含义,需要使用反斜杠 \ 进行转义。

  • 匹配点号(.):
    \\.

  • 匹配问号(?):
    \\?

  • 匹配星号(*):
    \\*

6. 非贪婪模式

默认情况下,量词是贪婪的,会尽可能多地匹配字符。可以通过在量词后加上 ? 来使其变为非贪婪模式,只匹配最少的字符。

  • 贪婪匹配:
    .* 会匹配整个字符串。

  • 非贪婪匹配:
    .*? 只会匹配尽可能少的字符

7. 常用举例

1. 匹配数字
  • 匹配任意数字(0-9):
    \\d

  • 匹配 n 位的数字:
    \\d{n}

  • 匹配至少 n 位的数字:
    \\d{n,}

  • 匹配 n 到 m 位的数字:
    \\d{n,m}

  • 匹配非数字字符:
    \\D

2. 匹配字母
  • 匹配任意小写字母(a-z):
    [a-z]

  • 匹配任意大写字母(A-Z):
    [A-Z]

  • 匹配任意大小写字母:
    [a-zA-Z]

  • 匹配字母数字(a-z, A-Z, 0-9):
    [a-zA-Z0-9]

  • 匹配非字母字符:
    [^a-zA-Z]

二、个人常用匹配 以及 实际应用

1、匹配邮箱

String regex = "^[A-Za-z0-9+_.-]+@(.+)$";

2、匹配Ipv4地址

String regex = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";

3、匹配url

String regex = "^(http://|https://)?([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}(/\\S*)?$";

4、匹配手机号

String regex = "^1[3-9]\\d{9}$";

5、匹配身份证号

String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\\d)|(3[0-1]))\\d{3}[0-9Xx]$";

6、匹配是否为一维整型数组,例如:[1, 2, 3]

literal.matches("\\[\\s*(-?\\d+\\s*,\\s*)*(-?\\d+)\\s*\\]")

7、匹配是否为二维整型数组,例如:[[1], [2, 3], [-4, 5]]

literal.matches(
                "\\[\\s*((\\[\\s*(-?\\d+\\s*,\\s*)*(-?\\d+)\\s*\\]\\s*,\\s*)*(\\[\\s*(-?\\d+\\s*,\\s*)*(-?\\d+)\\s*\\]\\s*))\\]");

8、匹配是否为二维字符串数组,例如:[[ "apple" ], [ "banana", "cherry" ]]

literal.matches(
                "\\[\\s*(\\[\\s*(\".*?\"\\s*,\\s*)*\".*?\"\\s*\\]\\s*,\\s*)*(\\[\\s*(\".*?\"\\s*,\\s*)*\".*?\"\\s*\\]\\s*)\\]");

9、匹配是否为二维字符串数组【2】,例如: [['hello', 'world'], ['foo', 'bar']]

 return literal.matches(
                "\\[\\s*((\\[\\s*'.*?'\\s*,\\s*)*(\\[\\s*'.*?'\\s*\\]\\s*))\\]");

10、将字符 串形式的二维字符数组 转化为 二维字符数组类型:

private static char[][] parse2DCharArray(String literal) {
    // 使用正则表达式定义一个模式,用于匹配最外层的方括号中的内容
    // \\[ 和 \\] 表示匹配 '[' 和 ']', 而 [^\\[\\]]+ 表示匹配除 '[' 和 ']' 之外的所有字符
    Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
    
    // 创建一个Matcher对象,通过传入的字符串 literal 查找符合正则表达式的子串
    Matcher matcher = pattern.matcher(literal);
    
    // 创建一个用于存储字符数组的列表,用于暂时保存解析出来的多个字符数组
    List<char[]> list = new ArrayList<>();
    
    // 使用 matcher.find() 循环遍历,找出所有符合正则表达式的子串
    // 每次找到一个匹配的子串(也就是一对方括号中的内容),都进行处理
    while (matcher.find()) {
        // matcher.group(1) 获取匹配的方括号中的内容(不包括方括号本身)
        // 将这部分内容传递给 parseCharArray 函数,将其解析为一个字符数组
        list.add(parseCharArray(matcher.group(1)));
    }
    
    // 将存储在 list 中的所有字符数组转换为一个二维字符数组并返回
    // toArray(new char[0][]) 是 Java 中将 List 转换为数组的常见写法
    return list.toArray(new char[0][]);
}

// 解析单个字符数组的方法,负责将形如 "'a', 'b'" 的字符串解析为字符数组
private static char[] parseCharArray(String str) {
    // 使用 split 方法将字符串按逗号分割,并去除逗号两侧的多余空格
    // 分割后的结果会是字符串数组,如 ["'a'", "'b'"]
    String[] elements = str.split("\\s*,\\s*");
    
    // 创建一个字符数组,其长度与分割后的字符串数组相同
    char[] chars = new char[elements.length];
    
    // 遍历分割后的字符串数组,将每个字符串中的字符提取出来
    for (int i = 0; i < elements.length; i++) {
        // 每个元素形如 "'a'",使用 charAt(1) 提取第二个字符,即单引号内的字符
        chars[i] = elements[i].charAt(1);
    }
    
    // 返回解析后的字符数组
    return chars;
}

11、将字符 串形式的二维整型数组 转化为 二维整型数组类型:

// 解析一个形如 "[[1, 2], [3, 4]]" 的字符串,将其转换为一个二维整数数组 int[][]
private static int[][] parse2DArray(String literal) {
    // 定义正则表达式,用于匹配最外层方括号中的内容
    // \\[ 和 \\] 表示匹配 '[' 和 ']', [^\\[\\]]+ 匹配除方括号以外的所有字符
    Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
    
    // 使用正则表达式在输入的字符串 literal 中查找符合模式的子串
    Matcher matcher = pattern.matcher(literal);
    
    // 创建一个用于暂存一维整数数组的列表
    List<int[]> list = new ArrayList<>();
    
    // 使用 matcher.find() 循环遍历字符串,找出所有符合正则表达式的子串
    // 每次找到一个匹配的子串(也就是一个方括号内的内容),就调用 parse1DArray 解析
    while (matcher.find()) {
        // 将每个匹配到的子串(即一维数组部分,如 "1, 2")传入 parse1DArray,解析为一维整数数组
        list.add(parse1DArray(matcher.group(1)));
    }
    
    // 将 list 转换为二维整数数组 int[][],并返回结果
    // new int[0][] 用于指定返回数组的类型,toArray 将 List 转换为数组
    return list.toArray(new int[0][]);
}

// 解析形如 "1, 2, 3" 的字符串,将其转换为一维整数数组 int[]
private static int[] parse1DArray(String literal) {
    // 定义正则表达式,用于匹配一个整数,可以包含负号
    // -? 表示可选的负号,\\d+ 表示一个或多个数字
    Pattern pattern = Pattern.compile("-?\\d+");
    
    // 使用正则表达式在输入的字符串 literal 中查找所有整数
    Matcher matcher = pattern.matcher(literal);
    
    // 创建一个用于存储整数的列表
    List<Integer> list = new ArrayList<>();
    
    // 使用 matcher.find() 遍历查找到的所有整数
    while (matcher.find()) {
        // matcher.group() 获取匹配的整数字符串,并将其解析为 Integer 对象
        list.add(Integer.parseInt(matcher.group()));
    }
    
    // 将 List<Integer> 转换为 int[] 并返回
    // stream().mapToInt() 将 Integer 对象转换为原始 int 类型
    return list.stream().mapToInt(Integer::intValue).toArray();
}

12、将字符 串形式的二维整型数组 转化为 二维整型List集合(类似11,仅修改收集方式):

private static List<List<Integer>> parse2DArrayToList(String literal) {
        Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
        Matcher matcher = pattern.matcher(literal);
        List<List<Integer>> list = new ArrayList<>();
        while (matcher.find()) {
            list.add(parse1DArrayToList(matcher.group(1)));
        }
        return list;
    }

    
    private static List<Integer> parse1DArrayToList(String literal) {
        Pattern pattern = Pattern.compile("-?\\d+");
        Matcher matcher = pattern.matcher(literal);
        List<Integer> list = new ArrayList<>();
        while (matcher.find()) {
            list.add(Integer.parseInt(matcher.group()));
        }
        return list;
    }

13、将字符 串形式的二维整型数组 转化为 二维字符串数组类型: 

 private static String[][] parse2DStringArray(String literal) {
        Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
        Matcher matcher = pattern.matcher(literal);
        List<String[]> list = new ArrayList<>();
        while (matcher.find()) {
            list.add(parseStringArray2(matcher.group(1)));
        }
        return list.toArray(new String[0][]);
    }

    private static String[] parseStringArray2(String literal) {
        // 使用正则表达式匹配双引号内的内容,忽略其中的逗号
        Pattern pattern = Pattern.compile("\"([^\"]*?)\"");
        Matcher matcher = pattern.matcher(literal);
        List<String> list = new ArrayList<>();
        while (matcher.find()) {
            list.add(matcher.group(1));
        }
        return list.toArray(new String[0]);
    }

14、将 双精度浮点数转 化为 整数(有小数保留1位小数,若5.0保留5)

private static String formatDouble(Double value) {
    // 检查是否为 null,如果是 null,返回空字符串
    if (value == null) {
        return "";
    }
    
    // 判断是否为整数
    if (value == value.intValue()) {
        return String.valueOf(value.intValue());  // 返回整数部分
    } else {
        // 确保使用统一的小数格式,保留一位小数
        DecimalFormat df = new DecimalFormat("0.0");
        return df.format(value);  // 返回保留一位小数的字符串
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值