有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Regex/Pattern/Matcher如何识别和存储所有不匹配?

来自CSV文件验证程序的代码片段:
我已经创建了^{}^{},它确定是否存在匹配
接下来,我想确定是否存在匹配,哪个字段不匹配并导致错误

最好的方法是什么

Pattern bodyPattern = Pattern.compile("([0-9]{11}),([A-Z0-9]{7}),([0-9]{7,8}),([0-9]{1}\\W[0-9]{2}E\\W[0-9]{2}),([0-9]{7,8}),([A-Z]{5}),([A-Z]{8,25}),(\\d+\\.\\d{0,2}),([0-9]{3})");

Matcher matcher = bodyPattern.matcher(line);

if(matcher.matches()) {
        System.out.println("SUCCESS: Body validation was successful");
} else {
        System.out.println("ERROR: Body validation failed in line " + lineNumber);
}

当前的输出是这样的
我想说的是,在令牌编号x处失败,但不确定如何做到这一点

Line # 1, Token #1, Token: 20171006003
Line # 1, Token #2, Token: OUTWARD
Line # 1, Token #3, Token: 1000004
Line # 1, Token #4, Token: 2.00E+36
Line # 1, Token #5, Token: 1000005
Line # 1, Token #6, Token: FALSE
Line # 1, Token #7, Token: ACCEPTED
Line # 1, Token #8, Token: 400
Line # 1, Token #9, Token: 826
ERROR: Body validation failed in line 1
ERROR: Body validation failed in token number


共 (1) 个答案

  1. # 1 楼答案

    使用java api,似乎无法在匹配失败后检索信息。在一般情况下,正则表达式可以回溯,最终状态可能没有用处,但在这种特殊情况下,通过反射检查Matcher可能会很有趣:

    // to make Matcher.groups field accessible
    Field matcherGroups = Matcher.class.getDeclaredField( "groups" );
    matcherGroups.setAccessible( true );
    
    Pattern p = Pattern.compile( "^(a+)(b+)(c+)$" );
    Matcher m = p.matcher( "aaabbcccc" );
    m.find();
    
    int[] groups = (int[])matcherGroups.get( m );
    System.out.println( Arrays.toString( groups ) );
    
    m = p.matcher( "aaab bcccc" );
    m.find();
    
    groups = (int[])matcherGroups.get( m );
    System.out.println( Arrays.toString( groups ) );
    

    输出是

    [0, 9, 0, 3, 3, 5, 5, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
    [0, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
    

    第一次匹配成功,并设置了组区域

    • 0:9:组0:aaabbcccc
    • 0:3:1组:aaa
    • 3:5:第2组:bb
    • 5:9:3组:cccc

    第二次匹配失败仅组0包含匹配的子序列区域

    • 0:4:for aaabin aaab bcccc

    对于您的特定情况,可以为每个字段定义一个Regexp,并使用,拆分字符串