Java进阶之正则表达式

简介: 【7月更文挑战第17天】正则表达式(RegEx)是一种模式匹配工具,用于在字符串中执行搜索、替换等操作。它由普通字符和特殊元字符组成,后者定义匹配规则。

Java进阶之正则表达式
今天来看一下正则表达式,什么是正则表达式呢?
正则表达式(Regular Expression,简称RegEx)是一种用于匹配字符串中字符组合的模式。可以帮助我们对文本字符串进行搜索、替换、分割和校验等操作。
正则表达式并不是Java所独有的特性,而是一种强大且灵活的工具,任何语言都可以结合它来实现功能。最早是由Perl语言中发展来的。
为什么是对字符串来进行操作呢?因为String是一种很强大的类型,支持任何类型的转换,用字符串都可以表示这些类型。
正则表达式由普通字符(例如字母和数字)以及特殊字符(称为元字符)组成,这些元字符具有特殊的含义,用于指定模式匹配的规则。
普通字符就不说了,元字符有以下分类:
元字符
.:匹配除换行符之外的任意单个字符。
[]:匹配方括号内的任意一个字符(字符类)。
[^]:匹配不在方括号内的任意一个字符(否定字符类)。
\d:匹配一个数字字符,等价于 [0-9]。
\D:匹配一个非数字字符,等价于 [^0-9]。
\w:匹配一个单词字符(字母、数字或下划线),等价于 [A-Za-z0-9]。
\W:匹配一个非单词字符,等价于 [^A-Za-z0-9
]。
\s:匹配任何空白字符(空格、制表符、换行符等)。
\S:匹配任何非空白字符。
限定符
*:匹配前面的子表达式零次或多次。
+:匹配前面的子表达式一次或多次。
?:匹配前面的子表达式零次或一次。
{n}:匹配前面的子表达式恰好n次。
{n,}:匹配前面的子表达式至少n次。
{n,m}:匹配前面的子表达式至少n次,但不超过m次。
定位符
^:匹配输入字符串的开始位置。
$:匹配输入字符串的结束位置。
分组和引用
(exp):匹配exp并捕获文本到自动命名的组里。
(?:exp):匹配exp但不捕获匹配的文本。
\n:引用编号为n的捕获组匹配的文本。
选择符
|:匹配两个或多个分支选择的任意一个。

  Java中提供了java.util.regex包下的类来支持正则表达式的使用。主要类和方法:
  Pattern类:它是正则表达式编译后的表示形式。通过调用Pattern.compile(String regex)方法,可以将正则表达式编译成Pattern对象。
  Matcher类:它用于对输入字符串进行正则表达式的匹配操作。可以通过Pattern对象的matcher(CharSequence input)方法获得Matcher对象。
  PatternSyntaxException:当正则表达式语法不正确时,会抛出这个异常。
  示例:
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;

  public class RegexExample {
      public static void main(String[] args) {
          // 编译正则表达式
          Pattern pattern = Pattern.compile("\\d+");
          // 要匹配的字符串
          String text = "电话号码是1316651,不是55125。";
          // 创建matcher对象
          Matcher matcher = pattern.matcher(text);
          // 查找匹配的字符串
          while (matcher.find()) {
              System.out.println("找到的电话号码: " + matcher.group());
          }
      }
  }
  通过上面可以看到\\d代表数字,+代表一次或者多次
  简单匹配了一下,并且输出了匹配到的字符。
  我们也可以进行校验,比如校验手机号邮箱的格式:
  // 手机号的正则表达式,这里假设手机号是11位数字,且以1开头
  Pattern pattern = Pattern.compile("^1[3-9]\\d{9}$");
  Matcher matcher = pattern.matcher("13800008888");
  System.out.println("验证结果: " + matcher.matches());
  Pattern和Matcher类中提供了很多的API来支持正则表达式。
  这里就不深究了,需要的时候直接让AI帮你写一个就行了。

  值得一提的是Java的String类提供的API很好的支持了正则表达式:
  public boolean matches(String regex):这个方法用于检查字符串是否与给定的正则表达式匹配。如果匹配,返回true;否则返回false。
  public String[] split(String regex):这个方法根据匹配给定的正则表达式来拆分字符串,并返回一个字符串数组。
  public String replaceAll(String regex, String replacement):这个方法将字符串中所有匹配给定的正则表达式的子串替换为指定的字符串。
  public String replaceFirst(String regex, String replacement):这个方法将字符串中第一个匹配给定的正则表达式的子串替换为指定的字符串。
  public String[] split(String regex, int limit):这个方法与split(String regex)类似,但增加了limit参数来限制拆分后的子字符串数组的长度。
  示例:
  public class RegexStringMethodsExample {
      public static void main(String[] args) {
          String text = "Hello 123 World 456!";
          // 使用 matches 方法检查字符串是否匹配正则表达式
          boolean isMatch = text.matches(".*\\d+.*");
          System.out.println("Matches digits: " + isMatch);
          // 使用 split 方法根据正则表达式拆分字符串
          String[] splitText = text.split("\\s+");
          for (String str : splitText) {
              System.out.println(str);
          }
          // 使用 replaceAll 方法替换所有匹配的子串
          String replacedText = text.replaceAll("\\d+", "numbers");
          System.out.println("Text after replacing numbers: " + replacedText);
          // 使用 replaceFirst 方法替换第一个匹配的子串
          String firstReplacedText = text.replaceFirst("\\d+", "number");
          System.out.println("Text after replacing first number: " + firstReplacedText);
          // 使用 split 方法并限制结果数组的长度
          String[] limitedSplitText = text.split("\\s+", 3);
          for (String str : limitedSplitText) {
              System.out.println(str);
          }
      }
  }
  正则表达式,可以极大地简化文本处理任务,提高开发效率。
  END
目录
相关文章
|
18天前
|
监控 Java API
|
2月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
21 4
|
2月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
20 3
|
2月前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
19 2
|
2月前
|
Java 编译器 API
Java进阶之标准注解
【7月更文挑战第15天】Java标准注解包括标记注解(如@Deprecated)、@Override(检查方法重写)、@SuppressWarnings(抑制警告)。多值注解如@RequestMapping在Spring中用于HTTP请求映射。元注解如@Retention控制注解保留策略,@Target指定应用位置。Java8引入类型注解(@FunctionalInterface、@SafeVarargs)和重复注解(@Repeatable)。自定义注解可通过反射读取,如示例中的MyMarkerAnnotation等。
19 2
|
2月前
|
Java 编译器 API
Java进阶之标准注解
Java进阶之标准注解
22 1
|
2月前
|
数据采集 监控 Java
day21:Java零基础 - 正则表达式
【7月更文挑战第21天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
22 1
|
2月前
|
Java 编译器 API
Java进阶之标准注解
Java进阶之标准注解
24 0
|
网络协议 Java API
Java新人必学课程,Java进阶学习全路线(内涵Java超级干货推送及专家社群福利)
自从拉了java社群之后,发现经常有一些新手java开发在吐槽,吐槽java不知道从何学起,感觉路很迷惘。其实小编想说,沉下心,你会发现要走的路并不是很难。为了帮助新人更好的成长,小编特意邀请了最课程的陆敏技老师来给大家进行java基础课程直播分享。
19064 0
下一篇
DDNS