ZetCode

Java Matcher.regionStart 方法

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

Matcher.regionStart 方法返回当前搜索区域的起始索引。 这是 Java 正则表达式区域功能的一部分。

区域允许您将模式匹配限制到输入的特定部分。 regionStart 方法有助于检查当前区域边界。

Matcher.regionStart 概述

regionStart 方法是一个简单的 getter,它返回一个整数。 这个整数表示当前搜索区域的包含起始索引。

默认情况下,区域跨越整个输入字符串(起始 = 0)。 您可以使用 region 方法更改此设置。 该区域会影响所有匹配操作。

Basic regionStart 示例

此示例演示了 regionStart 的默认行为。 在不设置区域的情况下,它返回 0,表示搜索整个输入。

MatcherRegionStartBasic.java
package com.zetcode;

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

public class MatcherRegionStartBasic {

    public static void main(String[] args) {
        
        String input = "The quick brown fox jumps over the lazy dog";
        Pattern pattern = Pattern.compile("fox");
        Matcher matcher = pattern.matcher(input);
        
        System.out.println("Default regionStart: " + matcher.regionStart());
        
        boolean found = matcher.find();
        System.out.println("Match found: " + found);
        System.out.println("Match start: " + matcher.start());
    }
}

输出显示默认区域从索引 0 开始。匹配器在位置 16 找到 "fox"。 在匹配后,regionStart 值不会改变。

设置自定义区域

此示例展示了如何设置自定义区域并验证其起始位置。 我们将搜索限制到输入字符串的一部分。

MatcherRegionCustom.java
package com.zetcode;

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

public class MatcherRegionCustom {

    public static void main(String[] args) {
        
        String input = "The quick brown fox jumps over the lazy dog";
        Pattern pattern = Pattern.compile("fox|dog");
        Matcher matcher = pattern.matcher(input);
        
        // Set region from index 20 to end
        matcher.region(20, input.length());
        System.out.println("Custom regionStart: " + matcher.regionStart());
        
        while (matcher.find()) {
            System.out.println("Found '" + matcher.group() + 
                "' at " + matcher.start());
        }
    }
}

由于区域从 20 开始,匹配器仅找到 "dog"。 较早的 "fox" 位于区域之外。 regionStart 正确报告 20。

带有锚点的区域开始

此示例演示了区域开始如何影响锚点匹配。 当设置区域时,像 ^ 这样的锚点的行为会有所不同。

MatcherRegionAnchors.java
package com.zetcode;

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

public class MatcherRegionAnchors {

    public static void main(String[] args) {
        
        String input = "First line\nSecond line\nThird line";
        Pattern pattern = Pattern.compile("^.*$", Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(input);
        
        // Set region starting at line 2
        matcher.region(input.indexOf("Second"), input.length());
        System.out.println("Region starts at: " + matcher.regionStart());
        
        while (matcher.find()) {
            System.out.println("Match: '" + matcher.group() + "'");
        }
    }
}

当启用 MULTILINE 时,^ 锚点在区域开始处匹配。 这显示了 regionStart 如何影响锚点行为。 仅匹配区域内的行。

重置区域

此示例演示了如何将区域重置为其默认状态,并验证 regionStart 值是否相应更改。

MatcherRegionReset.java
package com.zetcode;

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

public class MatcherRegionReset {

    public static void main(String[] args) {
        
        String input = "Sample text for region demonstration";
        Pattern pattern = Pattern.compile("text");
        Matcher matcher = pattern.matcher(input);
        
        // Set custom region
        matcher.region(10, 20);
        System.out.println("Custom regionStart: " + matcher.regionStart());
        
        // Reset to default region
        matcher.reset();
        System.out.println("Reset regionStart: " + matcher.regionStart());
        
        // Verify matching works on full input
        System.out.println("Match found: " + matcher.find());
    }
}

重置后,regionStart 返回 0。 然后,匹配器可以再次在整个输入字符串中找到匹配项。 重置会清除区域和匹配状态。

带有 LookingAt 的区域开始

此示例展示了 regionStart 如何影响 lookingAt 方法,该方法尝试在区域开始处进行匹配。

MatcherRegionLookingAt.java
package com.zetcode;

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

public class MatcherRegionLookingAt {

    public static void main(String[] args) {
        
        String input = "Start middle end";
        Pattern pattern = Pattern.compile("middle");
        Matcher matcher = pattern.matcher(input);
        
        // Set region starting at "middle"
        matcher.region(6, input.length());
        System.out.println("Region starts at: " + matcher.regionStart());
        
        // lookingAt tries to match at region start
        System.out.println("lookingAt: " + matcher.lookingAt());
        
        // Compare with matches (must match entire region)
        System.out.println("matches: " + matcher.matches());
    }
}

lookingAt 成功,因为它在区域开始处匹配。 matches 失败,因为它需要整个区域匹配。 regionStart 显示匹配开始的位置。

多个区域更改

此示例演示了在匹配操作期间,regionStart 如何随着多个区域调整而变化。

MatcherRegionMultiple.java
package com.zetcode;

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

public class MatcherRegionMultiple {

    public static void main(String[] args) {
        
        String input = "123-456-789-012";
        Pattern pattern = Pattern.compile("\\d{3}");
        Matcher matcher = pattern.matcher(input);
        
        // Initial region
        matcher.region(0, 9);
        System.out.println("First regionStart: " + matcher.regionStart());
        while (matcher.find()) {
            System.out.println("Found at: " + matcher.start());
        }
        
        // Change region
        matcher.region(4, input.length());
        System.out.println("\nSecond regionStart: " + matcher.regionStart());
        while (matcher.find()) {
            System.out.println("Found at: " + matcher.start());
        }
    }
}

输出显示 regionStart 如何随着每个区域更改而更新。 在每个区域中找到不同的匹配项。 该方法准确地反映了当前的搜索边界。

带有 Hit End 的区域开始

此示例探讨了在部分匹配之后,regionStarthitEnd 方法之间的关系。

MatcherRegionHitEnd.java
package com.zetcode;

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

public class MatcherRegionHitEnd {

    public static void main(String[] args) {
        
        String input = "partial match: cat";
        Pattern pattern = Pattern.compile("category");
        Matcher matcher = pattern.matcher(input);
        
        // Set region to include "cat" but not full pattern
        matcher.region(14, 17);
        System.out.println("regionStart: " + matcher.regionStart());
        
        System.out.println("matches: " + matcher.matches());
        System.out.println("hitEnd: " + matcher.hitEnd());
    }
}

虽然匹配失败,但 hitEnd 返回 true,因为匹配在区域结束时停止。 regionStart 显示匹配开始的位置。 这对于增量匹配很有用。

来源

Java Matcher.regionStart 文档

本教程深入介绍了 Matcher.regionStart 方法。 理解区域对于 Java 中高效的正则表达式处理至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的专业程序员。 我于 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和 8 本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程