如何创建一个否定的charclass模式?

时间:2011-02-26 17:02:43

标签: java regex

我需要一种方法,将模式作为参数并返回否定模式。输入模式总是一个charclass(否则它是不可能的)。直截了当的尝试

public Pattern negate(Pattern p) {
    return Pattern.compile("[^" + p.pattern() + "]");
}

private void test() {
    final Pattern p = Pattern.compile("[a-z]");
    final Pattern n = negate(p);
    System.out.println(n.matcher("0").matches());
}

失败是因为[中的[^[(与[^xyz[不同)从字面上取而不是作为嵌套charclass的开头。

1 个答案:

答案 0 :(得分:0)

你不能像这样嵌套字符类。

如果你总是知道你正在获得一个字符类,最简单的方法是修剪括号的输入字符串:

public Pattern negate(Pattern p) {
    return Pattern.compile("[^" + p.pattern().substring(1));
}

更健壮的方法是使用常规表达式解析输入......:)

相关问题