【问题标题】:Java - Regex/Pattern/Matcher - How do I identify and store all mismatches?Java - 正则表达式/模式/匹配器 - 如何识别和存储所有不匹配?
【发布时间】:2018-02-16 10:34:55
【问题描述】:

来自 CSV 文件验证器的代码 sn-p:
我创建了PatternMatcher,它会识别是否匹配。
接下来我想确定是否没有匹配,哪个字段不匹配并导致错误。

这样做的最佳方法是什么?

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,令牌:OUTWARD
第 1 行,令牌 #3,令牌:1000004
第 1 行,令牌 #4,令牌:2.00E+36
第 1 行,令牌 #5,令牌:1000005
第 1 行,令牌 #6,令牌:FALSE
第 1 行,令牌 #7,令牌:接受
第 1 行,令牌 #8,令牌:400
第 1 行,令牌 #9,令牌:826
错误:第 1 行的正文验证失败
错误:令牌编号中的正文验证失败

【问题讨论】:

标签: java regex csv pattern-matching


【解决方案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 : 对于aaabaaab bcccc

对于您的特定情况,您可以为每个字段定义一个正则表达式,并使用, 分割字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多