使用Java (1.6),我想拆分一个输入字符串,该字符串包含一个标题组件,然后是一些标记。令牌符合以下格式:a!char,一个空格字符,然后是一个2个字符的令牌名称(来自约束列表,例如C0或04),然后是5个数字。我已经为此构建了一个模式,但是它对于一个令牌(CE)是失败的,除非我删除令牌名称后面的5位数字的要求。单元测试比我更好地解释了这一点(见下文)
有人能帮我解决我失败模式的问题吗?对我来说,输入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));
}发布于 2009-10-30 12:51:22
我认为你在这里的错误是你使用了方括号。不要忘记,它们表示一个字符类,因此[04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]不会执行您期望的操作。
它所做的工作如下:
[04|C0|Q2|Q6|C4|B[2-6]构成一个字符类,与以下字符类之一匹配:|、[、0、2、3、4、5、6、B、D13或D14、H215或H116其余部分被解释为列出一组备选方案,特别是上面提到的字符类,或D17或D18或D19。这就是CE不工作的原因,因为它没有方括号。您可能要找的是(?:04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE)
发布于 2009-10-30 12:51:05
这没有任何意义:
[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)方括号仅用于字符类,不用于常规分组。使用(?:...)或(...)进行常规分组(后者也会捕获)。
https://stackoverflow.com/questions/1647915
复制相似问题