大写字母的Java正则表达式
我开始熟悉Java,但是我仍然觉得正则表达式非常混乱。我需要检查一个元素是否有两个大写字母,三个大写字母,四个大写字母,或者一个大写字母,一个空格,然后是另一个大写字母。这是我到目前为止的代码,但我觉得有一种更好(更有效)的方法来实现这一点大写字母的Java正则表达式,java,regex,Java,Regex,我开始熟悉Java,但是我仍然觉得正则表达式非常混乱。我需要检查一个元素是否有两个大写字母,三个大写字母,四个大写字母,或者一个大写字母,一个空格,然后是另一个大写字母。这是我到目前为止的代码,但我觉得有一种更好(更有效)的方法来实现这一点 public class First { public static void main(String[] args) { String one = "A scenario - CAPI 200 - 001"; St
public class First {
public static void main(String[] args) {
String one = "A scenario - CAPI 200 - 001";
String two = "A scenario - C T 200 - 001";
String three = "A scenaRio - CT 200 - 001";
String four = "A sCenario - CAP 200 - 001";
Pattern p = Pattern.compile("[A-Z][A-Z][A-Z][A-Z]");
Pattern q = Pattern.compile("[A-Z] [A-Z]");
Pattern r = Pattern.compile("[A-Z][A-Z]");
Pattern s = Pattern.compile("[A-Z][A-Z][A-Z]");
Matcher m =p.matcher(one);
if (m.find()){
System.out.println(m.group());
}
Matcher d =q.matcher(two);
if (d.find()){
System.out.println(d.group());
}
Matcher e =r.matcher(three);
if (e.find()){
System.out.println(e.group());
}
Matcher a =s.matcher(four);
if (a.find()){
System.out.println(a.group());
}
}
}
任何帮助都将不胜感激。使用此选项匹配2-4个大写字母,或大写、空格、大写
([A-Z]{2,4})|([A-Z] [A-Z])
编辑:
刚刚意识到您可能需要区分匹配的组
在这种情况下,您所做的并没有错,但是可以使用
[A-Z]{2}
方法进行优化,以缩短正则表达式。如果您告诉我们代码需要做什么,我们可以更好地找到满足您需要的解决方案。{n}
表示正则表达式的n次。你真的应该使用这种方法。因此,在您的情况下,使用
[A-Z]{4}
例如,一行4次。您可能可以将所有内容合并到一个
模式中
例如:
String[] inputs = {
// two capital letters in a row
"AA",
// three capital letters in a row
"BBB",
// four capital letters in a row
"CCCC",
// one capital letter, a space, and then another capital letter.
"D D" };
String pattern = "[A-Z]{2,4}|[A-Z] [A-Z]";
for (String input: inputs) {
System.out.println(Pattern.matches(pattern, input));
}
输出
true
true
true
true
首先,欢迎来到Regex世界。正则表达式用于将一组字符串模式汇总为一个表达式。例如,如果我们引用任何以大写字母开头且仅包含字母字符且长度小于15的字符串,则正则表达式将是:[a-Z][a-Z]{,15}
在您提出问题的示例中,它没有使用应使用的正则表达式,您可以在一个正则表达式中总结所有要匹配的情况,此表达式可以有一个OR运算符,该运算符将如下所示的正则表达式组:
([A-Z]{2})|([A-Z]{3})|([A-Z]{4})|([A-Z] [A-Z])
但是当第一个树部分可以使用repitition操作符{[minLenght],[Maxlength]}
仅在一个表达式中分组时,表达式将变为:
([A-Z]{2,4})|([A-Z] [A-Z])
括号顺序表示组顺序。您可以使用{feest_repetitions}
表示重复的部分--用下限替换fest_repetitions
,如果需要上限替换
注意:您的代码只显示两个匹配项,因为两个应与s
匹配,而four
应该与q
搭配(你有相反的选择)哇,谢谢你的帮助。具体来说,它需要检查数组列表中的项是否满足这些场景(它们都满足),然后只打印与场景匹配的大写字母。这是更清楚还是更混乱?@Michelle,接得好。我刚刚编辑了我的问题。\s将匹配任何空格,包括新行。只需使用一个文字空格。@AdamYost true,我认为这有点不够具体(OP称为“空格”)@Mena,很抱歉,这是不够具体的。我不是指空白,只是字符之间的文字空白。谢谢你的调查,谢谢你的回复!非常感谢您的回答!最好至少将不带空格的选项组合为[A-Z]{2,4}
,并检查匹配的长度以确定它是哪种类型,而不是使用3个单独的正则表达式。希望可以从我的答案中轻松推导出其方法。一旦我知道这里的具体目标,我会尝试更新。亚当,我对你的回答感激不尽。谢谢!是的,那会让事情变得更干净。谢谢你提供的信息。谢谢你提供的信息。我从发布这个问题中学到了比我读的多个教程更多的东西。真是太感激了。我希望我的声誉更高,这样我就可以投票支持你的答案。