Java正则表达式简介

Java是一门被广泛使用的编程语言,可以在包括 Windows 在内的多种平台上使用。有一些以 Java 或为 Java 编写的包中支持正则表达式功能。但是,因为现已成为 Java 2 一部分的 java.util.regex 包极好地支持了正则表达式功能,所以下面仅就 java.util.regex 这个包来讨论 Java 中的正则表达式功能。

Java 中的正则表达式可以用来验证文本,也可以对文本进行搜索和替换。Java 支持的字符类相当广泛,包括标准的正则表达式字符类,POSIX 符类以及 Unicode 字符类。此外,java.util.regex 包也提供其他方面的丰富功能。

java.util.regex 包简介

java.util.regex 包是在 J2SE 1.4 Java 2 Standard Edition Version 1.4 中引入的。因此,要在 Java 中使用正则表达式,至少需要 1.4 版本以上的 Java。

java.util.regex 包中有三个类 —— Pattern、Matcher 和 PatternSyntaxException。在本章节后面将分别介绍这三个类。

Pattern 类

java.util.regex.Pattern 类表示编译后的正则表达式。Pattern 类没有公共的构造函数,要创建一个模式(pattern)对象,必须使用该类的静态方法 compile()。

正则表达式模式是以一个字符串表示的。该正则表达式通过 compile() 方法编译成一个 Pattern 类的实例。而这个 Pattern 对象可以用于创建一个 Matcher 对象,通过 Matcher 对象就能依照在 Pattern 对象中定义的正则表达式来匹配任意字符序列。

典型的 Pattern 和 Matcher 对象的用法如下:

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

public class Demo1 {

    public static void main(String[] args) {
        Pattern myPattern= Pattern.compile("正则表达式");
        Matcher myMatcher = myPattern.matcher("测试字符串");
        boolean myBoolean = myMatcher.matches();
        System.out.println(myBoolean);
    }
    
}

注意:Pattern 类的实例是不可变的,因此在多线程环境下使用是安全的。

Matcher 类

正则表达式匹配器,可以使用 Pattern 的 matcher(CharSequence input)  方法获取。创建匹配器后,可以使用它执行三种不同的匹配操作: 

  • matches:方法尝试将整个输入序列与该模式匹配

  • lookingAt:方法尝试将输入序列从头开始与该模式匹配

  • find:方法扫描输入序列以查找与该模式匹配的下一个子序列

上面三个方法都返回一个表示成功或失败的布尔值。

匹配器在其输入的子集(称为区域)中查找匹配项。默认情况下,此区域包含全部的匹配器输入。可通过 region 方法修改区域,通过 regionStart 和 regionEnd 方法查询区域。区域边界与某些模式构造交互的方式是可以更改的。

此类还定义使用新字符串替换匹配子序列的方法,需要时,可以从匹配结果计算出新字符串的内容。可以先后使用 appendReplacement 和 appendTail 方法将结果收集到现有的字符串缓冲区,或者使用更加便捷的 replaceAll 方法创建一个可以在其中替换输入序列中每个匹配子序列的字符串。

注意:此类的实例用于多个并发线程是不安全的。

MatchResult 类

该类是匹配操作的结果。 此接口包含用于确定与正则表达式匹配结果的查询方法。通过 MatchResult 可以查看匹配边界、组和组边界,但是不能修改。

注意:该类从 JDK 1.5 版本提供 

PatternSyntaxException 类

该类从 JDK 1.4 开始可用,它用于当我们的正则表达式模式中存在语法错误时,抛出该异常类。该类继承自 RuntimeException,因此该类是未经检查的异常。

注意:未经检查及不需要使用 try catch 进行捕获,编译也不会抛出错误;

例如:执行下面错误的正则表达式

Pattern.matches("(hello( )(world)", "hello world");

抛出如下错误信息:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 16
(hello( )(world)
                ^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.accept(Pattern.java:1813)
at java.util.regex.Pattern.group0(Pattern.java:2908)
at java.util.regex.Pattern.sequence(Pattern.java:2051)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.util.regex.Pattern.matches(Pattern.java:1133)
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号