美文网首页
Java 正则表达式之字符串匹配

Java 正则表达式之字符串匹配

作者: Tinyspot | 来源:发表于2023-10-25 21:16 被阅读0次

    1. 正则字符

    1.1 转义字符

    • Java 中 \\ 代表其他语言中的一个 \
      • 数字 \\d
      • 反斜杠 \\\\
      • \\.
      • 空白字符 \\s
    • 正则特殊符号 * . ? + $ ^ [ ] ( ) { } | \ /

    1.2 字符匹配

    字符 描述
    . 匹配任意单个字符 (除\n)
    \s 匹配任意空白字符,包括空格、制表符、换页符等等。等价[ \f\n\r\t\v]
    ? {0, 1}, 可选
    + {1, }
    * {0, }
    [...] 匹配字符组中的任意单个字符
    [^…] 排除型字符组

    2. 量词匹配

    • 通用形式 {m,n} (逗号之间不能有空格)
    • {n} 出现 N 次
    • {m,} 至少 m 次
    • {0,n} 最多 N 次,隐式的上限是65536
    • {m,n} 出现 m ~ n 次
    • 常用量词
      • * 等价 {0,}
      • + 等价 {1,}
      • ? 等价 {0,1}

    2.1 匹配任意字符

    注:单独的 .* 会匹配到空白字符

    @Test
    public void anyChar() {
        String input = "3.141592653";
    
        String regex = ".*";
        Matcher matcher = Pattern.compile(regex).matcher(input);
    
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
    

    改为 .+

    2.2 匹配点

    @Test
    public void dotMatch() {
        String data = "3.141592653";
        String regex = "\\.";
        String result = data.replaceAll(regex, "-");
        System.out.println(result);
    }
    

    2.3 ? 匹配:可有可无

    @Test
    public void stringMatch() {
        String regex = "(\\+86|0086)?-?\\d{11}";
        boolean phone = "+86-18823238789".matches(regex);
        boolean phone2 = "0086-18823238789".matches(regex);
        boolean phone3 = "18823238789".matches(regex);
    }
    

    3. 字符串匹配

    String.matches(String regex)

    public final class String {
        public boolean matches(String regex) {
          return Pattern.matches(regex, this);
        }
    }
    

    3.1 String.matches(String regex)

    @Test
    public void stringMatch2() {
    
        boolean words = "abc".matches("...");
        boolean words2 = "abc".matches(".{3}");
        boolean ip = "192.168.10".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
        boolean mail = "Tinyspot@163.com".matches("\\w+@\\w+\\.(com|cn)");
    }
    

    4. 字符串替换

    4.1 replaceAll(regex, str)

    示例一:删除文本中的所有数字

    @Test
    public void test() {
        String str = "aa12bb44ee";
        String result = str.replaceAll("\\d+", "");
    }
    

    4.2 通配符匹配替换

    @Test
    public void test() {
        String str = "123a45bcd";
        String result = str.replaceAll("\\d?", "-");
        String result2 = str.replaceAll("\\d*", "-");
    
        // ----a---b-c-d-
        // --a--b-c-d-
    }
    

    输出结果

    # result
    ----a---b-c-d-
    # result2
    --a--b-c-d-
    

    注意:空字符串也会被匹配到,然后被替换为 -

    4.3 分组匹配替换 $

    示例:超过 10 个数字,改为字符串

    @Test
    public void groupReplace() {
        /**
         * {
         *     "1001": [
         *         "id": 1234567890123,
         *         "itemId": 123456789
         *     ],
         *     "1002": [
         *         "id": 12345,
         *         "itemId": 1234567890123
         *     ]
         * }
         */
        String jsonStr = "{\"1001\":[\"id\":1234567890123,\"itemId\":123456789],\"1002\":[\"id\":12345,\"itemId\":1234567890123]}";
    
        String result = jsonStr.replaceAll("(\\d{10,})", "\"$1\"");
        System.out.println(result);
    }
    

    替换结果:

    {
        "1001": [
            "id": "1234567890123",
            "itemId": 123456789
        ],
        "1002": [
            "id": 12345,
            "itemId": "1234567890123"
        ]
    }
    

    5. 其他

    5.1 开始符(^)和结束符($)

    示例:去除首尾的0

    @Test
    public void test() {
        String data = "00230045000";
        String start = data.replaceAll("^(0+)", "");
        String end = data.replaceAll("(0+)$", "");
        System.out.println(start + "; " + end);
    
        String result = data.replaceAll("^0+(.*?)0+$", "$1");
        System.out.println(result);
    }
    

    打印结果

    230045000; 00230045
    230045
    

    5.2 字符边界

    • \b 匹配一个单词边界
    • 光标前面的字符和后面的字符不全是 \w

    5.3 空白行(whilte lines)

    " \n" 空格加换行,空白行

    @Test
    public void whileLines() {
        String lines = " \n".replaceAll("^\\s*$", "----");
    
        String lines2 = " \n".replaceAll("^[\\s&&[^\\n]]*$", "----");
    
        boolean matches = " \n".matches("^[\\s&&[^\\n]]*\\n$");
    }
    

    相关文章

      网友评论

          本文标题:Java 正则表达式之字符串匹配

          本文链接:https://www.haomeiwen.com/subject/llxyidtx.html