正则表达式(Java)异常 - 寻求解释

时间:2009-10-30 03:44:24

标签: java regex

使用Java(1.6)我想分割一个包含标题组件的输入字符串,然后是一些标记。令牌符合以下格式:a! char,一个空格char,然后是一个2 char标记名称(来自约束列表,例如C0或04),然后是5位数字。我为此构建了一个模式,但是除非我删除了令牌名称后5位数的要求,否则它会失败一个令牌(CE)。单元测试比我能更好地解释(见下文)

任何人都可以帮助解决我的失败模式发生的事情吗?输入CE令牌对我来说没问题......

干杯!

@Test
public void testInputSplitAnomaly() {
    Pattern pattern = Pattern.compile("(?=(! [04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]\\d{5}))");
    splitByRegExp(pattern);
}
@Test
public void testInputSplitWorks() {
    Pattern pattern = Pattern.compile("(?=(! [04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]))");
    splitByRegExp(pattern);
}


public void splitByRegExp(Pattern pattern) {
    String input = "& 0000800429! C600080 123456789-! C000026 213  00300! 0400020 A1Y1! Q200002 13! CE00202 01 ! Q600006 020507! C400012 O00511011";
    String[] tokens = pattern.split(input);
    Arrays.sort(tokens);
    System.out.println("-----------------------------");
    for (String token : tokens) {
        System.out.println(token.substring(0,11));
    }
    assertThat(tokens,Matchers.hasItemInArray(startsWith("! CE")));
    assertThat(tokens.length,is(8));
}

2 个答案:

答案 0 :(得分:1)

这没有任何意义:

[04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]

我相信你想要:

(?:04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE)

方括号仅用于字符类,而不是一般分组。使用(?:...)(...)进行常规分组(后者也会捕获)。

答案 1 :(得分:1)

我认为你的错误就是你使用方括号。不要忘记这些表示一个字符类,因此[04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]不能达到预期的效果。

做的做的是:

  • [04|C0|Q2|Q6|C4|B[2-6]构成一个字符类,匹配以下内容之一:|[023,{{1 }},456BC
  • 其余部分被解释为列出一组备选方案,特别是上面提到的字符类 Q *或* Q[8-9] *或* C6 。这就是CE]不起作用的原因,因为它没有方括号。

你可能追求的是CE