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”
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}
在我看来是正确的,并且在我的测试中确实有效。