我需要一种方法,将模式作为参数并返回否定模式。输入模式总是一个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的开头。
答案 0 :(得分:0)
你不能像这样嵌套字符类。
如果你总是知道你正在获得一个字符类,最简单的方法是修剪括号的输入字符串:
public Pattern negate(Pattern p) {
return Pattern.compile("[^" + p.pattern().substring(1));
}
更健壮的方法是使用常规表达式解析输入......:)