java-正则表达式 1

发布于:2024-06-26 ⋅ 阅读:(139) ⋅ 点赞:(0)

Java中的正则表达式

1. 正则表达式的基本概念

正则表达式(Regular Expression, regex)是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex包提供了对正则表达式的支持,该包包含两个主要的类:PatternMatcher

2. 正则表达式的基本语法

正则表达式由普通字符(例如字符az)和特殊字符(或称为元字符)组成。元字符用于表示某种预定义的匹配模式。

2.1 常用元字符
  • • .:匹配任意单个字符(除换行符)。
  • • *:匹配零次或多次前面的字符。
  • • +:匹配一次或多次前面的字符。
  • • ?:匹配零次或一次前面的字符。
  • • []:定义一个字符类。匹配方括号中的任意字符。
  • • ^:匹配字符串的开始。
  • • $:匹配字符串的结束。
  • • |:表示逻辑或(OR)操作。
  • • ():用于分组和提取子字符串。
2.2 预定义字符类
  • • \d:匹配任意一个数字字符(0-9)。
  • • \D:匹配任意一个非数字字符。
  • • \w:匹配任意一个字母、数字或下划线字符。
  • • \W:匹配任意一个非字母、非数字、非下划线字符。
  • • \s:匹配任意一个空白字符(空格、制表符等)。
  • • \S:匹配任意一个非空白字符。

3. Pattern和Matcher类

3.1 Pattern类

Pattern类用于编译正则表达式。正则表达式首先被编译为一个Pattern对象,然后使用该对象创建一个Matcher对象。

3.2 Matcher类

Matcher类用于执行匹配操作。它提供了各种方法来检查是否匹配、查找匹配项以及替换文本等。

4. 正则表达式的使用示例

4.1 基本匹配

以下示例展示了如何使用正则表达式匹配一个字符串中的某个模式。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "This is a sample text with number 12345 and special character $.";

        String patternString = "\\d+";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            System.out.println("Found match: " + matcher.group());
        }
    }
}

在上述代码中,正则表达式\d+用于匹配一个或多个连续的数字字符。Matcher对象的find方法用于查找文本中所有符合该模式的子字符串。

4.2 字符类

以下示例展示了如何使用字符类来匹配特定字符集合。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "Sample text with various characters: abc ABC 123.";

        String patternString = "[a-zA-Z]";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            System.out.println("Found match: " + matcher.group());
        }
    }
}

在上述代码中,正则表达式[a-zA-Z]用于匹配所有字母字符,无论大小写。

4.3 分组

正则表达式支持分组功能,通过圆括号()来定义分组。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "John Doe, Jane Smith";

        String patternString = "(\\w+)\\s+(\\w+)";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            System.out.println("First name: " + matcher.group(1));
            System.out.println("Last name: " + matcher.group(2));
        }
    }
}

在上述代码中,正则表达式(\\w+)\\s+(\\w+)用于匹配名字和姓氏。分组捕获了名字和姓氏的不同部分,可以通过group方法分别访问它们。

5. 常用的正则表达式操作

5.1 匹配整个字符串

使用matches方法检查整个字符串是否完全匹配某个模式。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "12345";
        String patternString = "\\d+";

        boolean matches = Pattern.matches(patternString, text);
        System.out.println("Matches: " + matches); // 输出:Matches: true
    }
}
5.2 查找和替换

使用replaceAll方法替换所有匹配的子字符串。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "John Doe, Jane Smith";
        String patternString = "\\b(\\w+)(\\s+)(\\w+)\\b";
        String replacement = "$3, $1";

        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(text);
        String result = matcher.replaceAll(replacement);

        System.out.println("Result: " + result); // 输出:Doe, John, Smith, Jane
    }
}

在上述代码中,\\b(\\w+)(\\s+)(\\w+)\\b用于匹配名字和姓氏,$3, $1用于替换匹配的子字符串,调整名字和姓氏的顺序。

5.3 分割字符串

使用split方法根据正则表达式分割字符串。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "one,two,three,four";
        String patternString = ",";

        Pattern pattern = Pattern.compile(patternString);
        String[] parts = pattern.split(text);

        for (String part : parts) {
            System.out.println("Part: " + part);
        }
    }
}

在上述代码中,逗号(,)作为分隔符,split方法将字符串分割成多个部分。

6. 复杂的正则表达式示例

6.1 验证电子邮件地址

以下正则表达式用于验证电子邮件地址的格式。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String[] emails = {
            "user@example.com",
            "user.name@domain.com",
            "user-name@domain.co.in",
            "user_name@domain.com",
            "username@domain.c",
            "username@domain.com",
            "username@domain..com"
        };

        String patternString = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern pattern = Pattern.compile(patternString);

        for (String email : emails) {
            Matcher matcher = pattern.matcher(email);
            System.out.println(email + ": " + matcher.matches());
        }
    }
}

在上述代码中,正则表达式^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$用于验证电子邮件地址的格式。循环遍历多个电子邮件地址,检查它们是否符合该格式。

6.2 验证电话号码

以下正则表达式用于验证电话号码的格式(例如:123-456-7890)。

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String[] phoneNumbers = {
            "123-456-7890",
            "123.456.7890",
            "(123) 456-7890",
            "123 456 7890",
            "1234567890"
        };

        String patternString = "^(\\(\\d{3}\\)|\\d{3}[-.\\s]?)\\d{3}[-.\\s]?\\d{4}$";
        Pattern pattern = Pattern.compile(patternString);

        for (String phoneNumber : phoneNumbers) {
            Matcher matcher = pattern.matcher(phoneNumber);
            System.out.println(phoneNumber + ": " + matcher.matches());
        }
    }
}

在上述代码中,正则表达式^(\\(\\d{3}\\)|\\d{3}[-.\\s]?)\\d{3}[-.\\s]?\\d{4}$用于验证电话号码的格式。循环遍历多个电话号码,检查它们是否符合该格式。


网站公告

今日签到

点亮在社区的每一天
去签到