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

Java 中使用正则表达式

1. 引入包

在使用正则表达式之前,需要引入包:

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

2. 常用模式规则

  • 元字符 :这些是正则表达式中的特殊字符,用于匹配特定的模式。

    • . :匹配任意单个字符(换行符除外)。例如,a.b 可以匹配 "acb"、"aab" 等,但不能匹配 "ab" 或 "a\nb"。

    • ^ :匹配字符串的开头。比如,^abc 表示以 "abc" 开头的字符串,如 "abcdef"。

    • $ :匹配字符串的结尾。例如,abc$ 表示以 "abc" 结尾的字符串,如 "xyzabc"。

    • | :表示逻辑 “或”。如 a|b 可以匹配 "a" 或者 "b"。

    • * :匹配前一个字符或子表达式零次或多次。例如,ab* 可以匹配 "a"、"ab"、"abb" 等。

    • + :匹配前一个字符或子表达式一次或多次。比如,ab+ 可以匹配 "ab"、"abb",但不能匹配 "a"。

    • ? :匹配前一个字符或子表达式零次或一次。例如,ab? 可以匹配 "a" 和 "ab"。

    • [] :匹配括号内的任意一个字符。例如,[abc] 可以匹配 "a"、"b"、"c" 中的任意一个字符。

    • [^ ] :匹配不在括号内的任意一个字符。比如,[^abc] 可以匹配除 "a"、"b"、"c" 之外的任意一个字符。

    • - :在字符类中表示范围。例如,[a-z] 表示匹配任意一个小写字母。

    • \d :匹配任意一个数字,等价于 [0-9]

    • \D :匹配任意一个非数字,等价于 [^0-9]

    • \s :匹配任意一个空白字符,包括空格、制表符、换页符等。

    • \S :匹配任意一个非空白字符。

    • \w :匹配任意一个字母、数字或下划线,等价于 [A-Za-z0-9_]

    • \W :匹配任意一个非字母、数字或下划线。

  • 量词 :用于指定某个部分出现的次数或范围。

    • {n} :表示前面的字符或子表达式恰好出现 n 次。例如,a{3} 表示 "aaa"。

    • {n,} :表示前面的字符或子表达式至少出现 n 次。比如,a{2,} 表示至少出现两个 "a",如 "aa"、"aaa" 等。

    • {n,m} :表示前面的字符或子表达式出现次数在 n 到 m 之间。例如,a{1,3} 表示出现 1 - 3 次的 "a"。

3. 使用步骤

  • 创建 Pattern 对象 :通过 Pattern.compile() 方法编译一个正则表达式为模式对象。例如:

    Pattern pattern = Pattern.compile("a.b");

    这一步是对正则表达式进行预编译,提高匹配效率。

  • 创建 Matcher 对象 :调用 Pattern 对象的 matcher() 方法,传入要匹配的字符串,得到 Matcher 对象。例如:

    Matcher matcher = pattern.matcher("acb");

    Matcher 对象用于对字符串进行匹配操作。

  • 执行匹配操作 :使用 Matcher 类提供的方法进行匹配操作,常见的方法有:

    • matches() :尝试将整个字符串与模式匹配。如果整个字符串都符合模式,则返回 true,否则返回 false。例如:

      boolean result = matcher.matches(); // 判断整个字符串是否符合模式

      * `lookingAt()` :尝试将从字符串的开头开始与模式进行匹配。如果从开头开始匹配成功,则返回 true,否则返回 false。例如:

      boolean result = matcher.lookingAt(); // 判断字符串开头是否符合模式

      * `find()` :扫描字符串,查找与模式匹配的下一个子序列。如果找到,则返回 true,否则返回 false。每次调用 find() 方法会从上次匹配结束的位置继续查找。例如:

      while (matcher.find()) {System.out.println(matcher.group()); // 打印所有匹配的子序列
      }

      * `group()` :返回当前匹配的整个字符串或分组捕获的子串。如果调用 `group()` 无参数,返回整个匹配的字符串;如果传入分组索引,返回对应分组捕获的子串。例如:

      String wholeMatch = matcher.group(); // 获取整个匹配的字符串
      String group1 = matcher.group(1); // 获取第一个分组捕获的子串(如果有)

      4. 应用场景举例

      场景一:验证邮箱格式
      public class EmailValidation {public static void main(String[] args) {String regex = "^[A-Za-z0-9\\._%+-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$";Pattern pattern = Pattern.compile(regex);String email1 = "example@example.com";String email2 = "invalid-email";Matcher matcher1 = pattern.matcher(email1);Matcher matcher2 = pattern.matcher(email2);System.out.println("Email1 is valid: " + matcher1.matches()); // 输出 trueSystem.out.println("Email2 is valid: " + matcher2.matches()); // 输出 false}
      }

      在这个例子中,正则表达式用于验证字符串是否符合常见的邮箱格式。

      场景二:提取电话号码
      public class PhoneNumberExtractor {public static void main(String[] args) {String regex = "\\d{3}-\\d{3}-\\d{4}";Pattern pattern = Pattern.compile(regex);String text = "Contact us at 123-456-7890 or 987-654-3210.";Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("Found phone number: " + matcher.group());}// 输出:Found phone number: 123-456-7890, Found phone number: 987-654-3210}
      }

      通过正则表达式从文本中提取符合特定格式的电话号码。

      场景三:替换字符串中的部分内容
      public class StringReplacer {public static void main(String[] args) {String text = "Hello, world! Welcome to the world of Java.";String regex = "world";String replacement = "universe";String newText = text.replaceAll(regex, replacement);System.out.println(newText); // 输出:Hello, universe! Welcome to the universe of Java.}
      }

      使用 replaceAll() 方法将字符串中所有匹配正则表达式的内容替换为指定字符串。

http://www.xdnf.cn/news/3350.html

相关文章:

  • 在Linux中,KVM和Docker在Linux虚拟化中的区别是什么?
  • 【计算机视觉】语义分割:Mask2Former:统一分割框架的技术突破与实战指南
  • Mysql常用函数解析
  • Annotate better with CVAT
  • 华为OD机试真题——斗地主之顺子(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 《TCP/IP详解 卷1:协议》之第九章:IP选路
  • 湖仓一体化介绍
  • 数据库基本概念:数据库的定义、特点、分类、组成、作用
  • 详解TypeScript中的类型断言及其绕过类型检查机制
  • 【Vue bug】:deep()失效
  • 如何提升自我执行力?
  • 拆解 browser-use 项目——深入理解 Agent 层
  • Linux 环境下 Mysql 5.7 数据定期备份
  • Kotlin-运算符重载函数
  • 生产级RAG系统一些经验总结
  • HTN77A0原理图提供聚能芯半导体禾润一级代理技术支持免费送样
  • 1295.统计位数为偶数的数字
  • SWIG 和 JNA / JNI 等 C 接口封装工具及进行 C 接口的封装
  • AnimateCC基础教学:二次贝塞尔曲线的绘制。
  • Android 动态权限申请
  • 多通道经颅电刺激器的主流厂家介绍
  • hadoop集群建立
  • 【keil使用】无法打开keil工程,只有空白界面的解决方法
  • rk3568安全启动功能实践
  • 介绍一下Files类的常用方法
  • 车辆检测新突破:VFM-Det 如何用大模型提升识别精度
  • LVGL -按键介绍 上
  • Nginx 重写与重定向配置
  • SpringBoot集成Druid启动报错testWhileIdle is true, validationQuery not set
  • 【功能】根据时区获取开服天数