Java中的正则表达式:查找[char1]的所有实例,但前提是它们前面没有[char2]

时间:2012-01-30 08:48:44

标签: java regex regex-negation

我有以下方法,我希望分裂方法的正则表达式找到逗号字符(“,”)的所有实例,如果if前面没有字母“x”。

方法:


public void replaceTest3() {
        String valueRaw = "onex,two,three,fourx,five";
        String[] splittedString = valueRaw.split("[(.,)]&&[^x{1}+,]");
        for (int i = 0; i < splittedString.length; i++) {
            System.out.println(splittedString[i]);
        }
}

所以我希望这个方法输出


onex,two
three
fourx,five

但是,正如当前正则表达式所示,后一部分排除前面带有“x”的所有逗号实例都不起作用 - 显然没有找到任何内容。我的错误在哪里,我怎么能实现我想做的事?

3 个答案:

答案 0 :(得分:2)

  

查找逗号字符(“,”)的所有实例,如果不是   以字母“x”开头。

可以用这样的负面观察来完成:

(?<!x),

即:

valueRaw.split("(?<!x),");

答案 1 :(得分:0)

你的角色类是虚假的。特殊字符在字符类中失去意义。例如,[(.,)]&&[^x{1}+,]匹配“(&&+", ")&&{”,...

答案 2 :(得分:0)

如果您对更多代码没问题,这是一个没有后顾之处的解决方案:

private static final Pattern P = Pattern.compile( "[^x],|^," );
private static List<String> splitAtCommaNotPreceededByX( String valueRaw ) {
    Matcher m = P.matcher( valueRaw );
    List<String> parts = new ArrayList<String>();
    int start = 0;
    while(m.find()) {
        parts.add( valueRaw.substring( start, m.end() - 1 ) );
        start = m.end();
    }
    parts.add( valueRaw.substring( start ) );
    return parts;
}