首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式(Java)异常-寻求解释

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

Stack Overflow用户
提问于 2009-10-30 11:44:24
回答 2查看 140关注 0票数 1

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

有人能帮我解决我失败模式的问题吗?对我来说,输入CE令牌看起来没问题...

干杯!

代码语言:javascript
复制
@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));
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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]构成一个字符类,与以下字符类之一匹配:|[023456B、D13或D14、H215或H116其余部分被解释为列出一组备选方案,特别是上面提到的字符类,或D17或D18或D19。这就是CE不工作的原因,因为它没有方括号。

您可能要找的是(?:04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE)

票数 1
EN

Stack Overflow用户

发布于 2009-10-30 12:51:05

这没有任何意义:

代码语言:javascript
复制
[04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]

我相信你想要:

代码语言:javascript
复制
(?:04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1647915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档