当前位置: 首页 > news >正文

Java常用正则表达式及使用方法

在 Java 中,Pattern 和 Matcher 类是 java.util.regex 包的核心,用于处理正则表达式。

Pattern 类

Pattern 类表示编译后的正则表达式,它提供了一种将正则表达式字符串编译成可执行对象的方式,以便后续用于匹配操作。

常用方法
  1. compile(String regex):这是一个静态方法,用于将给定的正则表达式字符串编译为 Pattern 对象。
  2. matcher(CharSequence input):创建一个 Matcher 对象,该对象将使用编译好的正则表达式对指定的输入字符串进行匹配操作。
  3. split(CharSequence input):根据正则表达式将输入的字符串分割成字符串数组。
示例代码
import java.util.regex.Pattern;public class PatternExample {public static void main(String[] args) {// 编译正则表达式Pattern pattern = Pattern.compile("\\d+");// 使用 split 方法分割字符串String input = "abc123def456ghi";String[] parts = pattern.split(input);for (String part : parts) {System.out.println(part);}}
}

在上述代码中,首先使用 Pattern.compile("\\d+") 编译了一个匹配一个或多个数字的正则表达式。然后使用 split 方法将输入字符串按照数字进行分割,最后打印分割后的结果。

Matcher 类

Matcher 类用于对输入字符串执行匹配操作,它提供了多种方法来查找、替换和提取匹配的子字符串。

常用方法
  1. find():尝试在输入字符串中查找下一个匹配的子字符串,如果找到则返回 true,否则返回 false
  2. matches():尝试将整个输入字符串与正则表达式进行匹配,如果完全匹配则返回 true,否则返回 false
  3. group():返回上一次匹配操作所匹配的子字符串。
  4. replaceAll(String replacement):将输入字符串中所有匹配的子字符串替换为指定的字符串。
示例代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class MatcherExample {public static void main(String[] args) {// 编译正则表达式Pattern pattern = Pattern.compile("\\d+");// 创建 Matcher 对象Matcher matcher = pattern.matcher("abc123def456ghi");// 使用 find 方法查找匹配的子字符串while (matcher.find()) {System.out.println("找到匹配项: " + matcher.group());}// 使用 replaceAll 方法替换匹配的子字符串String result = matcher.replaceAll("X");System.out.println("替换后的字符串: " + result);}
}

在上述代码中,首先编译了一个匹配一个或多个数字的正则表达式,并创建了一个 Matcher 对象。然后使用 find 方法在输入字符串中查找所有匹配的数字,并打印出来。最后使用 replaceAll 方法将所有匹配的数字替换为字符 X,并打印替换后的字符串。

相关网站

  • 正则表达式在线测试工具:Regex101,可以在线测试和调试正则表达式,同时支持多种编程语言的语法。

正则表达式

正则表达式是用于匹配、查找和替换文本模式的强大工具,在许多编程语言和文本处理工具中都有广泛应用。以下是一些常用的正则表达式及其用途:

1. 匹配数字

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class DigitMatching {public static void main(String[] args) {String input = "abc123";// 匹配单个数字Pattern singleDigitPattern = Pattern.compile("\\d");Matcher singleDigitMatcher = singleDigitPattern.matcher(input);while (singleDigitMatcher.find()) {System.out.println("单个数字匹配结果: " + singleDigitMatcher.group());}// 匹配多个数字Pattern multipleDigitPattern = Pattern.compile("\\d+");Matcher multipleDigitMatcher = multipleDigitPattern.matcher(input);while (multipleDigitMatcher.find()) {System.out.println("多个数字匹配结果: " + multipleDigitMatcher.group());}}
}

2. 匹配字母

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class LetterMatching {public static void main(String[] args) {String input = "ABCabc";// 匹配单个小写字母Pattern lowerCasePattern = Pattern.compile("[a-z]");Matcher lowerCaseMatcher = lowerCasePattern.matcher(input);while (lowerCaseMatcher.find()) {System.out.println("单个小写字母匹配结果: " + lowerCaseMatcher.group());}// 匹配单个大写字母Pattern upperCasePattern = Pattern.compile("[A-Z]");Matcher upperCaseMatcher = upperCasePattern.matcher(input);while (upperTypeCaseMatcher.find()) {System.out.println("单个大写字母匹配结果: " + upperCaseMatcher.group());}// 匹配单个字母(不区分大小写)Pattern anyCasePattern = Pattern.compile("[a-zA-Z]");Matcher anyCaseMatcher = anyCasePattern.matcher(input);while (anyCaseMatcher.find()) {System.out.println("单个字母(不区分大小写)匹配结果: " + anyCaseMatcher.group());}}
}

3. 匹配字母和数字

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class AlphanumericMatching {public static void main(String[] args) {String input = "abc123@#$";// 匹配单个字母或数字Pattern singleAlphanumericPattern = Pattern.compile("[a-zA-Z0-9]");Matcher singleAlphanumericMatcher = singleAlphanumericPattern.matcher(input);while (singleAlphanumericMatcher.find()) {System.out.println("单个字母或数字匹配结果: " + singleAlphanumericMatcher.group());}// 匹配多个字母或数字Pattern multipleAlphanumericPattern = Pattern.compile("[a-zA-Z0-9]+");Matcher multipleAlphanumericMatcher = multipleAlphanumericPattern.matcher(input);while (multipleAlphanumericMatcher.find()) {System.out.println("多个字母或数字匹配结果: " + multipleAlphanumericMatcher.group());}}
}

4. 匹配空白字符

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class WhitespaceMatching {public static void main(String[] args) {String input = "abc  123";// 匹配单个空白字符Pattern singleWhitespacePattern = Pattern.compile("\\s");Matcher singleWhitespaceMatcher = singleWhitespacePattern.matcher(input);while (singleWhitespaceMatcher.find()) {System.out.println("单个空白字符匹配结果: " + singleWhitespaceMatcher.group());}// 匹配多个空白字符Pattern multipleWhitespacePattern = Pattern.compile("\\s+");Matcher multipleWhitespaceMatcher = multipleWhitespacePattern.matcher(input);while (multipleWhitespaceMatcher.find()) {System.out.println("多个空白字符匹配结果: " + multipleWhitespaceMatcher.group());}}
}

5. 匹配邮箱地址

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class EmailMatching {public static void main(String[] args) {String email = "test@example.com";String patternStr = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";Pattern pattern = Pattern.compile(patternStr);Matcher matcher = pattern.matcher(email);if (matcher.matches()) {System.out.println("有效邮箱地址");} else {System.out.println("无效邮箱地址");}}
}

6. 匹配手机号码

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PhoneNumberMatching {public static void main(String[] args) {String phone = "13800138000";String patternStr = "^1[3-9]\\d{9}$";Pattern pattern = Pattern.compile(patternStr);Matcher matcher = pattern.matcher(phone);if (matcher.matches()) {System.out.println("有效手机号码");} else {System.out.println("无效手机号码");}}
}
关于匹配邮箱详解:

"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";符号的含义

1. 定界符

  • ^:表示匹配字符串的开始位置。在该正则表达式中,它确保匹配是从字符串的起始处开始的,即邮箱地址的起始部分必须符合后续的规则。
  • $:表示匹配字符串的结束位置。意味着整个字符串必须完全匹配正则表达式所定义的模式,直到字符串结束。结合 ^ 和 $ 使用,能保证整个字符串是一个完整的邮箱地址,而不是包含在其他文本中的部分邮箱地址。

2. 用户名部分:[a-zA-Z0-9._%+-]+

  • [a-zA-Z0-9._%+-]:这是一个字符类,它定义了一组允许的字符。
    • a-zA-Z:表示所有的大小写英文字母,即 A 到 Z 和 a 到 z
    • 0-9:表示所有的数字,即 0 到 9
    • ._%+-:这些是特定的符号,在邮箱用户名中是允许出现的。
  • +:是一个量词,表示前面的字符类(即 [a-zA-Z0-9._%+-])必须出现一次或多次。也就是说,邮箱用户名至少要有一个字符,并且只能由上述定义的字符组成。

3. @

这是邮箱地址中用于分隔用户名和域名的固定符号,在正则表达式中直接使用该字符来匹配实际邮箱地址中的 @ 符号。

4. 域名部分:[a-zA-Z0-9.-]+

  • [a-zA-Z0-9.-]:同样是一个字符类,允许的字符包括大小写英文字母、数字、点号 . 和连字符 -。在域名中,这些字符是常见的组成部分。
  • +:表示前面的字符类必须出现一次或多次,即域名部分至少要有一个字符,且由上述定义的字符组成。

5. \\.

  • 点号 . 在正则表达式中有特殊含义,表示匹配任意单个字符。为了匹配实际的点号(即邮箱地址中的域名分隔符),需要使用反斜杠 \ 进行转义。由于在 Java 字符串中,反斜杠本身也需要转义,所以写成 \\.

6. 顶级域名部分:[a-zA-Z]{2,}

  • [a-zA-Z]:表示所有的大小写英文字母。
  • {2,}:是一个量词,表示前面的字符类(即 [a-zA-Z])必须出现至少 2 次。这是因为常见的顶级域名(如 .com.org.cn 等)通常至少由两个字母组成。

相关文章:

  • @Configuration注解对应实现implements WebMvcConfigurer的配置不生效问题。
  • AI写代码之GO+Python写个爬虫系统
  • Web3实战:从零开发你的ERC20代币合约
  • Idea 配置 Git
  • C++——多态、抽象类和接口
  • LLM 论文精读(一)Scaling Laws for Neural Language Models
  • 【Spring】静态代理、动态代理
  • 告别 Transformer:Mamba 模型如何实现线性时间序列建模
  • 如何在 Ansys Icepak AEDT 中设置多个流程以加快仿真速度?
  • AGI大模型(12):向量检索之关键字搜索
  • 乐视系列玩机------乐视2 x620红灯 黑砖刷写教程以及新版刷写工具的详细释义
  • GSAP 动画引擎实战:打造丝滑动效交互组件库
  • 百度 Al 智能体心响 App 上线
  • 探秘 SenseGlove Nova 2力反馈手套,解锁 VR 键盘交互新方式
  • 高并发秒杀使用RabbitMQ的优化思路
  • 1.3 本书结构概览:从理论基础到实践案例的系统阐述
  • Python3中使用jupyter notebook
  • 美乐迪电玩大厅加载机制与 RoomList 配置结构分析
  • 给vue-admin-template菜单栏 sidebar-item 添加消息提示
  • WHAT - 静态资源缓存穿透
  • 北京潮白河大桥发生火情:部分桥体受损,现场已双向断路
  • 美股反弹,纳斯达克中国金龙指数大涨3.69%
  • 我们的免疫系统,是世界上最好的“医生”
  • 一季度全国纪检监察机关共处分18.5万人,其中省部级干部14人
  • 世界读书日丨这50本书,商务印书馆推荐给教师
  • 中国在建结构第一高楼“天津117大厦”将复工,预计2027年完工