Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个模式有什么问题:pattern.compile(";\\p{Upper}{4}";)_Java_Regex - Fatal编程技术网

Java 这个模式有什么问题:pattern.compile(";\\p{Upper}{4}";)

Java 这个模式有什么问题:pattern.compile(";\\p{Upper}{4}";),java,regex,Java,Regex,我正在写一个模式匹配一个字符串,由4个大写字母组成 例如: “AAAA” “ABCD” “ZZZZ” 。。。都是正确的匹配项,而: “1DFG” “!@#$” “1234” 。。。应不匹配 在下面找到我的代码 它在“AAAA”上不断返回false 有人能解释一下吗 public static boolean checkSettings(String str) { Pattern p = Pattern.compile("\\p{Upper}{4}"); Matcher m

我正在写一个
模式
匹配一个
字符串
,由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;
    }
}

将您的模式更改为:

Pattern p = Pattern.compile("[A-Z]{4}");
将您的匹配器更改为:

Matcher m = p.matcher(str);

我认为您的
模式没有问题,可能是您的输入
字符串有问题

举个例子:

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}
不是相同的
模式,而是相反的模式

第二个实例否定4个大写字符(请参见大写“p”)。我指出这一点是因为你的问题标题指出了错误的
模式

最后一个音符

如果您只计划为您的
模式使用ASCII字母字符
,您可能希望使用
[A-Z]
(此处大写字母很重要),正如本线程中其他人提到的那样。它完全等同于
\\p{Upper}


\\p{Lu}
稍有不同,它将匹配大写字母

如果你真的通过了
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

你应该使用[A-Z]{4}@标记,不会有任何区别这是非常可疑的:
%str.format(str)
方法是静态的,所以
%str
字符串被忽略。第一个参数,这里的
str
,是格式字符串,因此如果传入的字符串包含任何格式符号,您的方法将崩溃。您好,扎克,您介意解释一下我的表达式不正确的原因吗?谢谢嗯,我不知道
\\p{Upper}
在做什么,但我认为
%str.format(str)
其中str=“AAAA”将导致“AAAAtr”,因为%s用于替换字符串,所以tr将被追加。因此,您传入的任何字符串都将使用小写字母。@ZackNewsham
“%str”。format(str)
非常可疑,但它并没有按照您所说的那样做(“%str”不是格式字符串,因此会被忽略)。不,
“%str”
是string的一个实例,您可以对字符串调用class方法
format
,产生一个新字符串(不再与
%str“
有关)。将其与
String.format(“AAAA”)
进行比较。是的,你说得对-我想我以前没有见过这种符号。同意<代码>\p{Upper}{4}
在我看来是正确的,并且在我的测试中确实有效。