当前教程
正则表达式简介
系列中的下一个

系列中的下一个: 字符串字面量

正则表达式简介

 

正则表达式简介

正则表达式是一种根据一组字符串中每个字符串共有的特征来描述一组字符串的方法。它们可用于搜索、编辑或操作文本和数据。您必须学习特定的语法来创建正则表达式 - 一种超越 Java 编程语言的正常语法的语法。正则表达式的复杂程度各不相同,但一旦您了解了它们的构造基础知识,您将能够破译(或创建)任何正则表达式。

在正则表达式的世界中,有许多不同的风格可供选择,例如 grep、Perl、Tcl、Python、PHP 和 awk。在 java.util.regex API 中的正则表达式语法与 Perl 中的语法最为相似。

java.util.regex 包主要包含三个类:Pattern、Matcher 和 PatternSyntaxException。

一个 Pattern 对象是正则表达式的编译表示。该 Pattern 类不提供公共构造函数。要创建模式,您必须首先调用其公共静态 compile() 方法之一,然后这些方法将返回一个 Pattern 对象。这些方法接受正则表达式作为第一个参数;以下部分将介绍所需的语法。

一个 Matcher 对象是解释模式并对输入字符串执行匹配操作的引擎。与 Pattern 类一样,Matcher 不定义任何公共构造函数。您可以通过调用 matcher() 方法来获取 Matcher 对象,该方法位于 Pattern 对象上。

一个 PatternSyntaxException 对象是一个未经检查的异常,表示正则表达式模式中的语法错误。

在深入研究每个类之前,您必须了解正则表达式是如何实际构建的。让我们介绍一个简单的测试工具,它将被重复使用来探索它们支持的语法。

 

Unicode 支持

从 JDK 7 版本开始,正则表达式模式匹配已扩展功能以支持 Unicode 6.0。

匹配特定代码点

您可以使用 \uFFFF 形式的转义序列匹配特定 Unicode 代码点,其中 FFFF 是要匹配的代码点的十六进制值。例如,\u6771 匹配东方的汉字。

或者,您可以使用 Perl 风格的十六进制表示法 \x{...} 指定代码点。例如

String hexPattern = "\x{" + Integer.toHexString(codePoint) + "}";

Unicode 字符属性

除了其值之外,每个 Unicode 字符还具有一些属性或特性。您可以使用表达式 \p{prop} 匹配属于特定类别的单个字符。您可以使用表达式 \P{prop} 匹配不属于特定类别的单个字符。

支持的三种属性类型是脚本、块和“通用”类别。

脚本

要确定代码点是否属于特定脚本,您可以使用 script 关键字或 sc 简写形式,例如 \p{script=Hiragana}。或者,您可以在脚本名称前加上字符串 Is,例如 \p{IsHiragana}

Pattern 支持的有效脚本名称是 UnicodeScript.forName() 接受的名称。

可以使用 block 关键字或 blk 简写形式指定块,例如 \p{block=Mongolian}。或者,您可以在块名称前加上字符串 In,例如 \p{InMongolian}

Pattern 支持的有效块名称是 UnicodeScript.forName() 接受的名称。

通用类别

类别可以使用可选前缀 Is 指定。例如,IsL 匹配 Unicode 字母类别。类别也可以使用 general_category 关键字或简写形式 gc 指定。例如,可以使用 general_category=Lugc=Lu 匹配大写字母。

支持的类别是 Unicode 标准 中由 Character 类指定的版本中的类别。

 

测试工具

本节定义了一个可重复使用的测试工具 RegexTestHarness.java,用于探索此 API 支持的正则表达式结构。运行此代码的命令是 java RegexTestHarness;不接受任何命令行参数。该应用程序反复循环,提示用户输入正则表达式和输入字符串。使用此测试工具是可选的,但您可能会发现它方便用于探索以下页面中讨论的测试用例。

 

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

public class RegexTestHarness {

    public static void main(String[] args){
        Console console = System.console();
        if (console == null) {
            System.err.println("No console.");
            System.exit(1);
        }
        while (true) {

            Pattern pattern = 
            Pattern.compile(console.readLine("%nEnter your regex: "));

            Matcher matcher = 
            pattern.matcher(console.readLine("Enter input string to search: "));

            boolean found = false;
            while (matcher.find()) {
                console.format("I found the text" +
                    " \"%s\" starting at " +
                    "index %d and ending at index %d.%n",
                    matcher.group(),
                    matcher.start(),
                    matcher.end());
                found = true;
            }
            if(!found){
                console.format("No match found.%n");
            }
        }
    }
}

在继续下一节之前,您可以保存并编译此代码以确保您的开发环境支持所需的包。


上次更新: 2022 年 1 月 10 日


当前教程
正则表达式简介
系列中的下一个

系列中的下一个: 字符串字面量