如何使用Java API确定正则表达式无法匹配的位置

Tim*_*imK 18 java regex

我有测试,我用正则表达式验证输出.当它失败时,它报告输出X与正则表达式Y不匹配.

我想添加一些指示字符串中匹配失败的位置.例如,匹配器在回溯之前得到的最远的是什么. Matcher.hitEnd()是我正在寻找的一个案例,但我想要更一般的东西.

这可能吗?

And*_*yer 7

如果匹配失败,则Match.hitEnd()告诉您更长的字符串是否匹配.此外,您可以在输入序列中指定要搜索的区域以查找匹配项.因此,如果您有一个无法匹配的字符串,您可以测试其前缀以查看匹配失败的位置:

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

public class LastMatch {
    private static int indexOfLastMatch(Pattern pattern, String input) {
        Matcher matcher = pattern.matcher(input);
        for (int i = input.length(); i > 0; --i) {
            Matcher region = matcher.region(0, i);
            if (region.matches() || region.hitEnd()) {
                return i;
            }
        }

        return 0;
    }

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("[A-Z]+[0-9]+[a-z]+");
        String[] samples = {
                "*ABC",
                "A1b*",
                "AB12uv",
                "AB12uv*",
                "ABCDabc",
                "ABC123X"
        };

        for (String sample : samples) {
            int lastMatch = indexOfLastMatch(pattern, sample);
            System.out.println(sample + ": last match at " + lastMatch);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类的输出是:

*ABC: last match at 0
A1b*: last match at 3
AB12uv: last match at 6
AB12uv*: last match at 6
ABCDabc: last match at 4
ABC123X: last match at 6
Run Code Online (Sandbox Code Playgroud)