Java中的正则表达式用于字符串的模式匹配,功能强大且灵活。Java通过java.util.regex包支持正则表达式,主要用到Pattern和Matcher两个类。以下是一些Java正则表达式的基本用法和示例:

基本用法

  1. ‌导入包‌:

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

  2. ‌创建Pattern对象‌:
    使用Pattern.compile(String regex)方法编译正则表达式,返回一个Pattern对象。

    
    
    	
    Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字
    

  3. ‌创建Matcher对象‌:
    使用Pattern对象的matcher(CharSequence input)方法,创建一个Matcher对象。

    
    
    	
    Matcher matcher = pattern.matcher("123abc456");

  4. ‌进行匹配‌:
    使用Matcher对象的方法如find()、matches()、start()、end()等进行匹配操作。

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

常用方法

  • ‌find()‌:尝试查找与该模式匹配的输入序列的下一个子序列。
  • ‌matches()‌:尝试将整个区域与模式匹配。
  • ‌group()‌:返回与上一个匹配操作匹配的输入子序列。
  • ‌start()和end()‌:返回上一个匹配操作匹配的子序列的起始和结束索引。

示例代码

以下是一个简单的示例,展示如何使用正则表达式在Java中查找字符串中的所有数字:



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

public class RegexExample {
    public static void main(String[] args) {
        String input = "There are 123 apples and 456 oranges.";
        String regex = "\\d+"; // 匹配一个或多个数字

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        while (matcher.find()) {
            System.out.println("Found a number: " + matcher.group() + " at position " + matcher.start() + " to " + matcher.end());
        }
    }
}

正则表达式语法

  • ‌.‌:匹配除换行符以外的任意单个字符。
  • ‌\\d‌:匹配一个数字,相当于[0-9]。
  • ‌\\D‌:匹配一个非数字字符。
  • ‌\\s‌:匹配一个空白字符,包括空格、制表符、换页符等。
  • ‌\\S‌:匹配一个非空白字符。
  • ‌\\w‌:匹配一个字母、数字或下划线,相当于[a-zA-Z_0-9]。
  • ‌\\W‌:匹配一个非字母、数字或下划线的字符。
  • ‌*‌:匹配前面的子表达式零次或多次。
  • ‌+‌:匹配前面的子表达式一次或多次。
  • ‌?‌:匹配前面的子表达式零次或一次。
  • ‌{n}‌:匹配前面的子表达式恰好n次。
  • ‌{n,}‌:匹配前面的子表达式至少n次。
  • ‌{n,m}‌:匹配前面的子表达式至少n次,至多m次。
  • ‌^‌:匹配输入字符串的开始位置。
  • ‌$‌:匹配输入字符串的结束位置。
  • ‌|‌:表示或操作。

正则表达式是一个非常强大的工具,可以极大地简化字符串处理任务。在Java中,通过java.util.regex包提供的类和方法,可以方便地应用正则表达式进行各种复杂的字符串匹配和操作。

在Java正则表达式中,特殊字符(也称为元字符)用于定义匹配模式和规则。以下是一些常见的特殊字符及其含义:

1. 字符匹配相关

  • ‌.‌

    • 匹配除换行符以外的任意单个字符。
    • 示例:a.c 可以匹配 "abc"、"acc" 等。
  • ‌\\d‌

    • 匹配一个数字,相当于 [0-9]。
    • 示例:\\d+ 可以匹配 "123"、"456" 等。
  • ‌\\D‌

    • 匹配一个非数字字符。
    • 示例:\\D+ 可以匹配 "abc"、"!@#" 等。
  • ‌\\s‌

    • 匹配一个空白字符,包括空格、制表符、换页符等。
    • 示例:\\s+ 可以匹配一个或多个空白字符。
  • ‌\\S‌

    • 匹配一个非空白字符。
    • 示例:\\S+ 可以匹配 "abc"、"123" 等。
  • ‌\\w‌

    • 匹配一个字母、数字或下划线,相当于 [a-zA-Z_0-9]。
    • 示例:\\w+ 可以匹配 "abc123"、"_underscore" 等。
  • ‌\\W‌

    • 匹配一个非字母、数字或下划线的字符。
    • 示例:\\W+ 可以匹配 "!@#"、"$$$" 等。

2. 数量词相关

  • ‌*‌

    • 匹配前面的子表达式零次或多次。
    • 示例:ab* 可以匹配 "a"、"ab"、"abb" 等。
  • ‌+‌

    • 匹配前面的子表达式一次或多次。
    • 示例:ab+ 可以匹配 "ab"、"abb",但不能匹配 "a"。
  • ‌?‌

    • 匹配前面的子表达式零次或一次。
    • 示例:ab? 可以匹配 "a"、"ab"。
  • ‌{n}‌

    • 匹配前面的子表达式恰好 n 次。
    • 示例:a{3} 可以匹配 "aaa"。
  • ‌{n,}‌

    • 匹配前面的子表达式至少 n 次。
    • 示例:a{2,} 可以匹配 "aa"、"aaa" 等。
  • ‌{n,m}‌

    • 匹配前面的子表达式至少 n 次,至多 m 次。
    • 示例:a{2,3} 可以匹配 "aa"、"aaa"。

3. 位置相关

  • ‌^‌

    • 匹配输入字符串的开始位置。
    • 示例:^abc 可以匹配以 "abc" 开头的字符串。
  • ‌$‌

    • 匹配输入字符串的结束位置。
    • 示例:abc$ 可以匹配以 "abc" 结尾的字符串。
  • ‌\\b‌

    • 匹配一个单词边界,即单词字符和非单词字符之间的位置。
    • 示例:\\bword\\b 可以匹配独立的单词 "word"。
  • ‌\\B‌

    • 匹配非单词边界。
    • 示例:\\Bword\\B 可以匹配 "sword" 中的 "word",但不能匹配独立的 "word"。

4. 分组和选择相关

  • ‌()‌

    • 标记一个子表达式的开始和结束位置,可用于分组。
    • 示例:(ab)+ 可以匹配 "ab"、"abab" 等。
  • ‌|‌

    • 表示或关系,匹配左边或右边的子表达式。
    • 示例:a|b 可以匹配 "a" 或 "b"。
  • ‌[ ]‌

    • 字符集,匹配方括号中的任意字符。
    • 示例:[abc] 可以匹配 "a"、"b" 或 "c"。
  • ‌[^ ]‌

    • 负字符集,匹配不在方括号中的任意字符。
    • 示例:[^abc] 可以匹配除 "a"、"b"、"c" 以外的任意字符。

5. 转义字符

  • ‌\\‌
    • 转义字符,用于匹配特殊字符本身或引入特殊序列。
    • 示例:\\. 可以匹配字面上的点号 "."。

示例代码

以下是一个简单的示例,展示如何使用这些特殊字符:



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

public class RegexSpecialCharacters {
    public static void main(String[] args) {
        String input = "Hello 123 World! 456";
        String regex = "\\d+"; // 匹配一个或多个数字

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

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

在这个示例中,\\d+ 用于匹配字符串中的一个或多个数字。

Java正则表达式中的特殊字符提供了强大的模式匹配能力。通过组合使用这些特殊字符,可以构建出复杂的正则表达式,用于各种字符串处理任务。在使用时,需要注意转义字符的使用,以确保正则表达式能够正确解析。

以下是几个常用的Java正则表达式示例,涵盖不同的应用场景:


1. ‌验证电子邮件地址‌

‌正则表达式‌:



String regex = "^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";

‌说明‌:

  • ^ 和 $ 分别匹配字符串的开始和结束。
  • [\\w._%+-]+ 匹配邮箱用户名部分,允许字母、数字、下划线、点、百分号、加号和减号。
  • @[\\w.-]+ 匹配域名部分,允许字母、数字、点和减号。
  • \\.[a-zA-Z]{2,} 匹配顶级域名,至少两个字母。

‌示例代码‌:



String email = "example@test.com";
boolean isValid = email.matches("^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
System.out.println("Is valid email: " + isValid);


2. ‌验证手机号码(中国大陆)‌

‌正则表达式‌:



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

‌说明‌:

  • 1 表示手机号以1开头。
  • [3-9] 表示第二位是3到9之间的数字。
  • \\d{9} 表示后面跟着9个数字。

‌示例代码‌:



String phoneNumber = "13812345678";
boolean isValid = phoneNumber.matches("1[3-9]\\d{9}");
System.out.println("Is valid phone number: " + isValid);


3. ‌验证IPv4地址‌

‌正则表达式‌:



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

‌说明‌:

  • 25[0-5] 匹配250到255之间的数字。
  • 2[0-4]\\d 匹配200到249之间的数字。
  • 1\\d{2} 匹配100到199之间的数字。
  • [1-9]?\\d 匹配0到99之间的数字。
  • (\\....){3} 确保有四个部分,每部分用点分隔。

‌示例代码‌:



String ipAddress = "192.168.1.1";
boolean isValid = ipAddress.matches("^(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)){3}$");
System.out.println("Is valid IP address: " + isValid);


4. ‌验证日期格式(YYYY-MM-DD)‌

‌正则表达式‌:



String regex = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$";

‌说明‌:

  • \\d{4} 匹配四位年份。
  • (0[1-9]|1[0-2]) 匹配月份,01到12。
  • (0[1-9]|[12]\\d|3[01]) 匹配日期,01到31。

‌示例代码‌:



String date = "2023-10-05";
boolean isValid = date.matches("^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$");
System.out.println("Is valid date: " + isValid);


5. ‌匹配URL‌

‌正则表达式‌:



String regex = "^(https?|ftp)://[\\w.-]+(:\\d+)?(/[\\w./?%&=-]*)?$";

‌说明‌:

  • (https?|ftp) 匹配协议,http、https或ftp。
  • :// 匹配协议和主机名之间的分隔符。
  • [\\w.-]+ 匹配主机名。
  • (:\\d+)? 匹配可选的端口号。
  • (/[\\w./?%&=-]*)? 匹配可选的路径。

‌示例代码‌:



String url = "https://www.example.com";
boolean isValid = url.matches("^(https?|ftp)://[\\w.-]+(:\\d+)?(/[\\w./?%&=-]*)?$");
System.out.println("Is valid URL: " + isValid);


6. ‌验证密码强度(至少8个字符,包含字母和数字)‌

‌正则表达式‌:



String regex = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$";

‌说明‌:

  • (?=.*[A-Za-z]) 确保至少包含一个字母。
  • (?=.*\\d) 确保至少包含一个数字。
  • [A-Za-z\\d]{8,} 确保总长度至少为8个字符。

‌示例代码‌:



String password = "Password123";
boolean isValid = password.matches("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$");
System.out.println("Is strong password: " + isValid);


7. ‌匹配纯数字字符串‌

‌正则表达式‌:



String regex = "^\\d+$";

‌说明‌:

  • ^ 和 $ 分别匹配字符串的开始和结束。
  • \\d+ 匹配一个或多个数字。

‌示例代码‌:



String number = "123456";
boolean isValid = number.matches("^\\d+$");
System.out.println("Is numeric string: " + isValid);


8. ‌匹配空白字符‌

‌正则表达式‌:



String regex = "\\s+";

‌说明‌:

  • \\s+ 匹配一个或多个空白字符,包括空格、制表符、换页符等。

‌示例代码‌:



String text = "Hello   World!";
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println("Found whitespace at position: " + matcher.start() + " to " + matcher.end());
}


总结

这些示例展示了Java正则表达式在不同场景下的应用,包括验证输入格式、匹配特定模式等。正则表达式是一种强大的工具,但也可能变得复杂,因此在设计时应尽量保持简洁和清晰。根据具体需求,可以调整正则表达式的复杂度,以满足不同的匹配要求。

更多推荐