2

我正在写一个由 4 个大写字母组成的Pattern匹配 a 。String

例如:

  • “啊啊啊”
  • “A B C D”
  • “ZZZZ”

...都是正确的匹配,而:

  • “1DFG”
  • “!@#$”
  • “1234”

...应该匹配。

在下面找到我的代码。

它不断返回false“AAAA”。

任何人都可以对此有所了解吗?

public static boolean checkSettings(String str) {
    Pattern p = Pattern.compile("\\p{Upper}{4}");
    Matcher m = p.matcher("%str".format(str));
    if (m.matches()) {
        return true;
    } else {
        // System.exit(1)
        return false;
    }
}
4

3 回答 3

5

我认为您的输入没有问题Pattern,可能您的输入有问题String

举个例子:

Pattern p = Pattern.compile("\\p{Upper}{4}");
Matcher m = p.matcher("%str".format("AAAA"));
System.out.println(m.find());

输出:

true

警告

\\p{Upper}{4}并且\\P{Upper}{4}不是相同Pattern,而是彼此相反的一个。

第二个实例否定 4 个大写字符(参见大写“P”)。我指出这一点是因为您的问题标题表明错误Pattern

最后说明

如果您只打算使用 ASCII 字母字符Pattern,您可能想要使用[A-Z](此处大写重要),正如本线程中其他人所提到的。它与\\p{Upper}.

与 略有不同\\p{Lu},它将匹配大写字母的Unicode 类别。

于 2013-09-26T08:50:45.890 回答
0

将您的模式更改为:

Pattern p = Pattern.compile("[A-Z]{4}");

将您的匹配器更改为:

Matcher m = p.matcher(str);
于 2013-09-26T08:48:11.787 回答
0

如果你真的传入,你的代码应该给出正确的结果AAAA。但是,您应该像这样重写您的代码:

public static boolean checkSettings(String str) {
    Pattern p = Pattern.compile("\\p{Upper}{4}");
    Matcher m = p.matcher(String.format(str));
    return m.matches();
}

甚至

public static boolean checkSettings(String str) {
    return str.matches("\\p{Upper}{4}");
}

这些示例广泛等同于您的代码。我刚刚测试了它,它返回true.AAAA

于 2013-09-26T09:05:11.487 回答