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

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() 方法将字符串中所有匹配正则表达式的内容替换为指定字符串。

相关文章:

  • OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传【内含常用设计模式设计示例】
  • 初学Vue之记事本案例
  • 数字智慧方案6165丨智慧医养大数据平台(50页PPT)(文末有下载方式)
  • (34)VTK C++开发示例 ---将图片映射到平面
  • 初学者如何学习AI问答应用开发范式
  • go实现双向链表
  • 《排序算法总结》
  • Three.js在vue中的使用(一)-基础
  • 雅马哈SMT贴片机高效精密制造解析
  • kotlin中 热流 vs 冷流 的本质区别
  • 学习 Django 之前
  • 手撕哈希表
  • Elastic Search 的安装、使用方式
  • 【音视频】RTMP流媒体服务器搭建、推流拉流
  • AVDictionary 再分析
  • 原型模式(Prototype Pattern)详解
  • Redis持久化方式
  • Postgresql源码(145)优化器nestloop参数化路径评估不准问题分析
  • 如何免费使用 DeepSeek-Prover-V2?
  • 加密算法(一)-对称加密(DES、AES、3DES、Blowfish、Twofish)一篇了解所有主流对称加密,轻松上手使用。
  • 体坛联播|曼联一只脚迈进欧联杯决赛,赵心童4比4奥沙利文
  • 王毅谈金砖国家开展斡旋调解的经验和独特优势
  • 五一假期,这些短剧值得一刷
  • 这就是上海!
  • 邮储银行一季度净赚超252亿降逾2%,营收微降
  • 新闻1+1丨应对外部冲击,中央政治局会议释放哪些信号?