大写字母的Java正则表达式

大写字母的Java正则表达式,java,regex,Java,Regex,我开始熟悉Java,但是我仍然觉得正则表达式非常混乱。我需要检查一个元素是否有两个大写字母,三个大写字母,四个大写字母,或者一个大写字母,一个空格,然后是另一个大写字母。这是我到目前为止的代码,但我觉得有一种更好(更有效)的方法来实现这一点 public class First { public static void main(String[] args) { String one = "A scenario - CAPI 200 - 001"; St

我开始熟悉Java,但是我仍然觉得正则表达式非常混乱。我需要检查一个元素是否有两个大写字母,三个大写字母,四个大写字母,或者一个大写字母,一个空格,然后是另一个大写字母。这是我到目前为止的代码,但我觉得有一种更好(更有效)的方法来实现这一点

 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个单独的正则表达式。希望可以从我的答案中轻松推导出其方法。一旦我知道这里的具体目标,我会尝试更新。亚当,我对你的回答感激不尽。谢谢!是的,那会让事情变得更干净。谢谢你提供的信息。谢谢你提供的信息。我从发布这个问题中学到了比我读的多个教程更多的东西。真是太感激了。我希望我的声誉更高,这样我就可以投票支持你的答案。