ZetCode

Java Pattern.pattern() 方法

上次修改时间:2025 年 4 月 20 日

Pattern.pattern 方法是 Java 正则表达式 API 中一个简单但重要的方法。 它返回编译 Pattern 对象时所使用的正则表达式字符串。 本教程涵盖了此方法的所有方面。

当您需要从已编译的 Pattern 对象中检索原始的正则表达式模式时,pattern 方法特别有用。 它是 java.util.regex.Pattern 类的一部分,自 Java 1.4 以来就已可用。

Pattern.pattern() 方法概述

pattern 方法返回用于创建 Pattern 实例的正则表达式的字符串表示形式。 这是创建对象时传递给 Pattern.compile 的确切字符串。

方法签名很简单:public String pattern。它不接受任何参数,并返回原始的正则表达式模式字符串。返回的字符串不包括可能已使用的任何模式标志。

pattern() 的基本用法

pattern 最直接的用法是从已编译的 Pattern 对象中检索正则表达式模式。这对于调试或需要将模式传递给另一个方法时很有帮助。

PatternBasicExample.java
package com.zetcode;

import java.util.regex.Pattern;

public class PatternBasicExample {

    public static void main(String[] args) {
        
        String regex = "\\d{3}-\\d{2}-\\d{4}";
        Pattern pattern = Pattern.compile(regex);
        
        // Retrieve the original pattern string
        String retrievedPattern = pattern.pattern();
        
        System.out.println("Original regex: " + regex);
        System.out.println("Retrieved pattern: " + retrievedPattern);
        System.out.println("Are equal? " + regex.equals(retrievedPattern));
    }
}

在本例中,我们编译了一个简单的社会安全号码格式的模式。然后,我们使用 pattern 来检索原始正则表达式。

输出结果表明,检索到的模式与用于编译的原始字符串完全相同。这证实了 pattern 返回确切的输入字符串。

带有标志的模式

将 pattern 标志与 Pattern.compile 一起使用时,pattern 方法仍然只返回原始的正则表达式字符串。 这些标志单独存储在 Pattern 对象中。

PatternWithFlags.java
package com.zetcode;

import java.util.regex.Pattern;

public class PatternWithFlags {

    public static void main(String[] args) {
        
        String regex = "hello world";
        Pattern caseInsensitivePattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        
        System.out.println("Pattern with flags: " + caseInsensitivePattern.pattern());
        System.out.println("Flags: " + caseInsensitivePattern.flags());
    }
}

本例显示了 pattern 返回原始正则表达式,而不管编译期间使用了任何标志。可以使用 flags 方法单独访问这些标志。

输出将显示原始的 "hello world" 字符串,而不会反映已应用的忽略大小写标志。在使用带标志的模式时,理解此行为很重要。

Pattern.toString() vs pattern()

Pattern 类也有一个 toString 方法,其行为类似于 pattern。 两种方法都返回原始的正则表达式字符串,但它们在 API 设计中服务于不同的目的。

PatternToStringComparison.java
package com.zetcode;

import java.util.regex.Pattern;

public class PatternToStringComparison {

    public static void main(String[] args) {
        
        String regex = "[A-Za-z]+";
        Pattern pattern = Pattern.compile(regex);
        
        System.out.println("pattern() result: " + pattern.pattern());
        System.out.println("toString() result: " + pattern.toString());
        
        // Comparing the outputs
        System.out.println("Are equal? " + 
            pattern.pattern().equals(pattern.toString()));
    }
}

本例演示了这两种方法都返回正则表达式模式的相同字符串表示形式。 toString 方法主要用于调试,而 pattern 是访问正则表达式字符串的官方方式。

实际上,当您特别需要正则表达式字符串时,应该使用 pattern,因为它使您的意图对其他开发人员来说更清晰。

将 pattern() 与 Matcher 一起使用

pattern 方法在使用 Matcher 对象时很有用,它允许您访问创建 Matcher 的原始模式。

PatternWithMatcher.java
package com.zetcode;

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

public class PatternWithMatcher {

    public static void main(String[] args) {
        
        String regex = "\\b\\w{4}\\b";  // Match 4-letter words
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher("This is a sample text with some words");
        
        // Access the pattern through the Matcher
        Pattern matcherPattern = matcher.pattern();
        System.out.println("Matcher's pattern: " + matcherPattern.pattern());
        
        // Find all matches
        while (matcher.find()) {
            System.out.println("Found: " + matcher.group() + 
                " matching pattern: " + matcher.pattern().pattern());
        }
    }
}

在本例中,我们演示了如何从 Matcher 对象访问原始模式。 Matcher 的 pattern 方法返回 Pattern 对象,从中我们可以获取字符串模式。

此技术在复杂的应用程序中特别有用,您可能需要验证 Matcher 正在使用哪个模式或出于调试目的记录该模式。

Pattern.pattern() 在实际应用中的应用

在实际应用程序中,pattern 可用于模式验证、日志记录或动态模式修改。 这是一个展示实际用例的示例。

PatternPracticalUse.java
package com.zetcode;

import java.util.regex.Pattern;

public class PatternPracticalUse {

    public static void main(String[] args) {
        
        // Simulate loading patterns from configuration
        String[] patternStrings = {
            "\\d{3}-\\d{3}-\\d{4}",  // Phone number
            "\\w+@\\w+\\.\\w+",      // Simple email
            "\\d{16}"                // Credit card number
        };
        
        Pattern[] patterns = new Pattern[patternStrings.length];
        
        // Compile all patterns
        for (int i = 0; i < patternStrings.length; i++) {
            patterns[i] = Pattern.compile(patternStrings[i]);
        }
        
        // Later in the application, we need to identify which pattern failed
        String testInput = "invalid-email";
        
        for (Pattern p : patterns) {
            if (!p.matcher(testInput).matches()) {
                System.out.println("Input '" + testInput + 
                    "' doesn't match pattern: " + p.pattern());
            }
        }
    }
}

本例模拟了一个常见场景,即模式从配置中加载,然后用于验证。 当验证失败时,我们使用 pattern 来记录哪个模式导致了失败。

检索原始模式字符串的能力对于调试以及向用户或日志提供有意义的错误消息非常重要。

Pattern.pattern() 与自定义模式类

在创建包装 Pattern 对象的自定义类时,您可以公开 pattern 方法以允许访问底层的正则表达式字符串。

CustomPatternWrapper.java
package com.zetcode;

import java.util.regex.Pattern;

public class CustomPatternWrapper {
    
    private final Pattern pattern;
    private final String description;
    
    public CustomPatternWrapper(String regex, String description) {
        this.pattern = Pattern.compile(regex);
        this.description = description;
    }
    
    public String getPatternString() {
        return pattern.pattern();
    }
    
    public String getDescription() {
        return description;
    }
    
    public Pattern getPattern() {
        return pattern;
    }

    public static void main(String[] args) {
        
        CustomPatternWrapper emailValidator = new CustomPatternWrapper(
            "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", 
            "Email address validator");
        
        System.out.println("Validator description: " + emailValidator.getDescription());
        System.out.println("Underlying pattern: " + emailValidator.getPatternString());
    }
}

本例演示了一种常见的设计模式,您将 Pattern 对象包装在自定义类中。 通过通过 getter 公开 pattern 方法,您可以保持对原始正则表达式字符串的访问。

当您需要向模式匹配功能添加元数据(如描述字段)或附加行为时,此方法很有用。

来源

Java Pattern.pattern() 文档

在本教程中,我们深入探讨了 Pattern.pattern 方法。 虽然简单,但此方法通过提供对原始模式字符串的访问权限在 Java 的正则表达式 API 中起着重要作用。

作者

我叫 Jan Bodnar,是一名经验丰富的程序员,在这一领域拥有多年的经验。 我从 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程