Java 正则表达式详解

正则表达式 (Regular Expression,简称 regex) 是一种强大的文本处理工具,可以用来匹配、搜索和替换文本中的特定模式。在 Java 中,正则表达式由 java.util.regex 包提供支持。

1. 理解正则表达式语法

正则表达式使用特殊的字符和符号来定义匹配模式。一些常用的元字符如下:

  • .: 匹配任意单个字符

  • *: 匹配前面的字符零次或多次

  • +: 匹配前面的字符一次或多次

  • ?: 匹配前面的字符零次或一次

  • \[\]: 匹配括号内的任意单个字符

  • \^: 匹配不包含在括号内的任意单个字符

  • ^: 匹配字符串开头

  • $: 匹配字符串结尾

  • \d: 匹配任意数字

  • \w: 匹配任意字母、数字或下划线

  • \s: 匹配任意空白字符

2. 使用 Pattern 和 Matcher 类

Java 中使用 Pattern 类来编译正则表达式,并使用 Matcher 类来执行匹配操作。

代码示例:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
    public static void main(String[] args) {
        // 1. 定义正则表达式
        String regex = "\\d+"; // 匹配一个或多个数字

        // 2. 编译正则表达式
        Pattern pattern = Pattern.compile(regex);

        // 3. 创建 Matcher 对象
        String text = "There are 123 apples and 456 oranges.";
        Matcher matcher = pattern.matcher(text);

        // 4. 查找匹配项
        while (matcher.find()) {
            // 5. 获取匹配的字符串
            String matchedString = matcher.group();
            System.out.println("Matched string: " + matchedString);
        }
    }
}

代码解释:

  • Pattern.compile(regex) 将正则表达式字符串编译成 Pattern 对象。

  • matcher.find() 尝试在文本中找到下一个匹配项。

  • matcher.group() 返回当前匹配项的字符串。

输出结果:

java 复制代码
Matched string: 123
Matched string: 456

3. 其他常用方法

  • matcher.matches(): 检查整个文本是否完全匹配正则表达式。

  • matcher.lookingAt(): 检查文本开头是否匹配正则表达式。

  • matcher.replaceAll(replacement): 将所有匹配项替换为指定字符串。

  • matcher.replaceFirst(replacement): 将第一个匹配项替换为指定字符串。

代码示例:

java 复制代码
String text = "Hello, world!";
String regex = "\\w+"; // 匹配一个或多个字母

// 替换所有匹配项为 "***"
String replacedText = matcher.replaceAll("***");
System.out.println(replacedText); // 输出: ***, ***!

// 替换第一个匹配项为 "Hi"
String replacedText2 = matcher.replaceFirst("Hi");
System.out.println(replacedText2); // 输出: Hi, world!

4. 练习

  1. 提取电子邮件地址:

    编写一个 Java 程序,使用正则表达式从以下文本中提取所有电子邮件地址:

    java 复制代码
    "Contact us at support@example.com or info@example.org for any inquiries."

    答案代码:

    java 复制代码
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class EmailExtractor {
        public static void main(String[] args) {
            String text = "Contact us at support@example.com or info@example.org for any inquiries.";
            String regex = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
    
            while (matcher.find()) {
                System.out.println("Email: " + matcher.group());
            }
        }
    }
  2. 验证电话号码格式:

    编写一个 Java 程序,使用正则表达式验证以下电话号码是否符合格式:

    java 复制代码
    123-456-7890

    答案代码:

    java 复制代码
    import java.util.regex.Pattern;
    
    public class PhoneNumberValidator {
        public static void main(String[] args) {
            String phoneNumber = "123-456-7890";
            String regex = "\\d{3}-\\d{3}-\\d{4}";
            boolean isValid = Pattern.matches(regex, phoneNumber);
    
            if (isValid) {
                System.out.println("Valid phone number.");
            } else {
                System.out.println("Invalid phone number.");
            }
        }
    }
  3. 替换文本中的所有空格为下划线:

    编写一个 Java 程序,使用正则表达式将以下文本中的所有空格替换为下划线:

    java 复制代码
    "This is a test string."

    答案代码:

    java 复制代码
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class SpaceReplacer {
        public static void main(String[] args) {
            String text = "This is a test string.";
            String regex = "\\s";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
            String replacedText = matcher.replaceAll("_");
            System.out.println(replacedText); // 输出: This_is_a_test_string.
        }
    }

结语: 以上就是关于Java中正则表达式的用法,也是必备的知识,对于文本处理方面有很大帮助,希望对各位看官有所帮助,下期见,谢谢~

相关推荐
andrsted10 小时前
用练题簿小程序 - 让错题不再白错
学习·微信小程序·小程序·学习方法
2601_9499506310 小时前
练题簿,把培训从“走过场”变成“真落地”
人工智能·学习·小程序·刷题·小程序推荐
mldong13 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾113 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生13 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
问天_观心14 小时前
大模型微调学习(二)
人工智能·python·深度学习·学习·语言模型·transformer
zhanghe68714 小时前
es的密码带有特殊字符,导出
java
指掀涛澜天下惊14 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
平头哥技术团队14 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
pnoker14 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3