首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Java确定正则表达式不匹配的位置

如何使用Java确定正则表达式不匹配的位置
EN

Stack Overflow用户
提问于 2011-04-15 00:33:36
回答 4查看 6K关注 0票数 20

我有一些使用正则表达式验证输出的测试。失败时,它会报告输出X与正则表达式Y不匹配。

我想添加一些指示,说明字符串中匹配失败的位置。例如,在回溯之前,匹配器在字符串中得到的最远距离是多少。Matcher.hitEnd()就是我正在寻找的一个例子,但我想要更通用的东西。

这有可能做到吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-20 22:36:23

如果匹配失败,则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);
        }
    }
}

这个类的输出是:

*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
票数 9
EN

Stack Overflow用户

发布于 2014-04-08 21:45:58

您可以获取该字符串,并对其进行迭代,在每次迭代时从字符串末尾再删除一个字符,然后检查是否存在hitEnd()

int farthestPoint(Pattern pattern, String input) {
    for (int i = input.length() - 1; i > 0; i--) {
        Matcher matcher = pattern.matcher(input.substring(0, i));
        if (!matcher.matches() && matcher.hitEnd()) {
            return i;
        }
    }
    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2011-05-05 01:01:09

您可以使用一对replaceAll()调用来指示输入字符串的正匹配和负匹配。例如,假设您想要验证一个十六进制字符串;下面将指示输入字符串的有效和无效字符。

String regex = "[0-9A-F]"
String input = "J900ZZAAFZ99X"
Pattern p = Pattern.compile(regex)
Matcher m = p.matcher(input)
String mask = m.replaceAll('+').replaceAll('[^+]', '-')
System.out.println(input)
System.out.println(mask)

这将打印以下内容,在有效字符下显示+,在无效字符下显示-

J900ZZAAFZ99X
-+++--+++-++-
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5666486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档