我有测试我用正则表达式验证输出。当它失败时,报告输出X与正则表达式Y不匹配。
我想添加一些指示字符串中匹配失败的位置。例如。在追溯之前,匹配者在字符串中最远的是什么? Matcher.hitEnd()是我正在寻找的一个例子,但是我想要一些比较通用的东西。
这可以做吗
如果匹配失败,则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