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

Java-Regex/Pattern/Matcher-如何识别和存储所有不匹配?,java,regex,csv,pattern-matching,Java,Regex,Csv,Pattern Matching,来自CSV文件验证程序的代码片段: 我已经创建了and,它标识是否存在匹配项。 接下来,我想确定是否存在匹配,哪个字段不匹配并导致错误 最好的方法是什么 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

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

最好的方法是什么

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处失败,但不确定如何做到这一点

行#1,令牌#1,令牌:20171006003
第1行,记号第2行,记号:向外
第1行,令牌第3行,令牌:1000004
第1行,记号第4行,记号:2.00E+36
第1行,令牌第5行,令牌:1000005
第1行,记号第6行,记号:FALSE
第1行,令牌第7行,令牌:已接受
第1行,令牌第8行,令牌:400
第1行,记号第9行,记号:826
错误:第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组:
    aaabbccc
  • 0:3:1组:
    aaa
  • 3:5:第2组:
    bb
  • 5:9:3组:
    cccc
第二次匹配失败,仅组0包含匹配的子序列区域

  • 0:4:对于
    aaab bcccc

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

拆分字符串,因此基本上您希望说明哪个字段在csv中无效?该重复问题答案中的可能重复项基本上就是您要寻找的。