🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

一、正则表达式基础概念

字符类

数量词

边界匹配器

分组

二、Java中使用正则表达式

Pattern类

Matcher类

字符串类中的正则表达式方法

三、进阶知识

反向引用

环视(Lookaround)

正则表达式优化

四、实践与总结


img

一、正则表达式基础概念

正则表达式(Regular Expression)是用于描述字符串模式的工具,在Java中广泛用于字符串的匹配、查找、替换和分割等操作。

字符类
  • 普通字符:直接匹配自身的字符,例如 a 匹配字符串中的 a
  • 元字符:具有特殊含义的字符,例如 . 匹配任意单个字符(除换行符外)。
  • 预定义字符类
    • \d:匹配任意一个数字字符,等价于 [0 - 9]
    • \w:匹配任意一个单词字符(包括字母、数字和下划线),等价于 [a - zA - Z0 - 9_]
    • \s:匹配任意一个空白字符(包括空格、制表符、换行符等),等价于 [ \t\n\x0B\f\r]
数量词
  • 贪婪数量词:尽可能多地匹配字符。
    • *:匹配前面的字符零次或多次。例如,a* 可以匹配空字符串、aaaaaa 等。
    • +:匹配前面的字符一次或多次。例如,a+ 可以匹配 aaaaaa 等,但不能匹配空字符串。
    • ?:匹配前面的字符零次或一次。例如,a? 可以匹配空字符串或 a
    • {n}:匹配前面的字符恰好 n 次。例如,a{3} 只匹配 aaa
    • {n,}:匹配前面的字符至少 n 次。例如,a{3,} 可以匹配 aaaaaaaaaaaa 等。
    • {n,m}:匹配前面的字符最少 n 次,最多 m 次。例如,a{2,4} 可以匹配 aaaaaaaaa
边界匹配器
  • ^:匹配字符串的开始位置。例如,^a 表示字符串必须以 a 开头。
  • $:匹配字符串的结束位置。例如,a$ 表示字符串必须以 a 结尾。
分组

使用圆括号 () 进行分组。分组可以将多个字符组合成一个单元,以便对整个单元应用数量词或其他操作。例如,(ab)+ 可以匹配 abababababab 等。

二、Java中使用正则表达式

在Java中,主要通过 java.util.regex 包来处理正则表达式,涉及的主要类有 PatternMatcher

Pattern类

Pattern 类表示一个编译后的正则表达式。使用 Pattern.compile(String regex) 方法来编译正则表达式。

import java.util.regex.Pattern;

public class PatternExample {
    public static void main(String[] args) {
        String regex = "\\d+";
        Pattern pattern = Pattern.compile(regex);
    }
}
Matcher类

Matcher 类用于在目标字符串上执行匹配操作。通过 Pattern.matcher(CharSequence input) 方法获得 Matcher 对象。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MatcherExample {
    public static void main(String[] args) {
        String regex = "\\d+";
        String input = "abc123def456";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        while (matcher.find()) {
            System.out.println("找到匹配项: " + matcher.group());
        }
    }
}

在上述代码中,matcher.find() 方法用于查找下一个匹配项,matcher.group() 方法用于获取当前匹配的字符串。

字符串类中的正则表达式方法

String 类也提供了一些与正则表达式相关的方法。

  • matches(String regex):判断字符串是否完全匹配给定的正则表达式。
public class StringMatchesExample {
    public static void main(String[] args) {
        String input = "12345";
        String regex = "\\d+";
        boolean matches = input.matches(regex);
        System.out.println("是否匹配: " + matches);
    }
}
  • split(String regex):根据正则表达式分割字符串。
public class StringSplitExample {
    public static void main(String[] args) {
        String input = "apple,banana,orange";
        String regex = ",";
        String[] parts = input.split(regex);
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
  • replaceAll(String regex, String replacement):将所有匹配正则表达式的子字符串替换为指定的字符串。
public class StringReplaceAllExample {
    public static void main(String[] args) {
        String input = "abc123def456";
        String regex = "\\d+";
        String replacement = "X";
        String result = input.replaceAll(regex, replacement);
        System.out.println("替换后的字符串: " + result);
    }
}

三、进阶知识

反向引用

在正则表达式中,反向引用允许在替换字符串或匹配模式中引用之前分组捕获的内容。在Java中,使用 $ 符号加上组号来进行反向引用。例如,(\d{4})-(\d{2})-(\d{2}) 这个正则表达式可以匹配日期格式 YYYY - MM - DD,在替换时可以使用 $2/$3/$1 将日期格式转换为 MM/DD/YYYY

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BackReferenceExample {
    public static void main(String[] args) {
        String input = "2023-05-10";
        String regex = "(\d{4})-(\d{2})-(\d{2})";
        String replacement = "$2/$3/$1";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        String result = matcher.replaceAll(replacement);
        System.out.println("转换后的日期: " + result);
    }
}
环视(Lookaround)

环视是一种特殊的匹配方式,它只进行匹配检查,不消耗字符。

  • 肯定前视(Positive Lookahead)(?=pattern),断言右侧能匹配 pattern。例如,\d+(?=%) 可以匹配字符串中紧跟 % 的数字,如 10% 中的 10
  • 否定前视(Negative Lookahead)(?!pattern),断言右侧不能匹配 pattern。例如,\d+(?!%) 可以匹配字符串中不紧跟 % 的数字。
  • 肯定后视(Positive Lookbehind)(?<=pattern),断言左侧能匹配 pattern。例如,(?<=\$)\d+ 可以匹配字符串中紧跟 $ 的数字,如 $10 中的 10
  • 否定后视(Negative Lookbehind)(?<!pattern),断言左侧不能匹配 pattern
正则表达式优化
  • 减少回溯:回溯是正则表达式匹配过程中为了找到匹配结果而进行的字符回退操作,过多的回溯会导致性能下降。尽量使用占有优先量词(如 *+++?+)或固化分组((?>pattern))来减少不必要的回溯。
  • 预编译正则表达式:如果需要多次使用同一个正则表达式,应将其编译为 Pattern 对象并复用,而不是每次都调用 Pattern.compile 方法。

四、实践与总结

要熟练掌握Java正则表达式,需要大量的实践。可以通过解决实际问题、在线练习平台(如Regex101等)来加深对正则表达式的理解和运用能力。同时,在编写复杂的正则表达式时,要注意可读性和可维护性,必要时添加注释来解释正则表达式的功能。通过不断学习和实践,逐渐达到熟练运用正则表达式解决各种字符串处理问题的水平。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐