这种模式有什么问题:Pattern.compile(“\\ p {Upper} {4}”)

时间:2013-09-26 08:43:57

标签: java regex

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

例如:

  • “AAAA”
  • “ABCD”
  • “ZZZZ”

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

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

...应该匹配。

在下面找到我的代码。

它一直在“AAAA”上返回false

有人可以对此有所了解吗?

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;
    }
}

3 个答案:

答案 0 :(得分:4)

我认为您的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

最后的注释

如果您只打算为Pattern使用ASCII字母字符,则可能需要使用[A-Z](此处大写重要),如此线程中的其他人所述。它与\\p{Upper}完全相同。

\\p{Lu}略有不同,后者与大写字母的Unicode category相匹配。

答案 1 :(得分:0)

将您的模式更改为:

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

将您的匹配器更改为:

Matcher m = p.matcher(str);

答案 2 :(得分: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