我开始熟悉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());
}
}
}
任何帮助都将不胜感激。
答案 0 :(得分:5)
使用它来匹配2-4个大写字母,或大写字母,空格,大写
([A-Z]{2,4})|([A-Z] [A-Z])
编辑: 刚刚意识到你可能需要区分哪个组匹配。
在这种情况下,您所做的事情并没有错,但可以使用[A-Z]{2}
方法进行优化以缩短正则表达式。如果您告诉我们代码需要做什么,我们可以更好地提出满足您需求的解决方案。
答案 1 :(得分:1)
{n}
表示正则表达式n次。你真的应该使用这种方法。所以在你的情况下,使用
[A-Z]{4}
例如,表示连续4次。
答案 2 :(得分:1)
您可以将所有内容合并到一个Pattern
。
例如:
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
答案 3 :(得分:1)
首先,欢迎来到Regex世界。正则表达式用于将一组String模式汇总到一个表达式中。例如,如果我们引用任何以大写字母开头并且只包含字母字符且长度小于15的字符串,那么正则表达式将是:[A-Z][a-z]{,15}
。
在你提出问题的例子中,它没有使用正则表达式,因为你可以在一个正则表达式中汇总你想要匹配的所有情况,这个表达式可以有一个OR运算符。像这样的正则表达式组:
([A-Z]{2})|([A-Z]{3})|([A-Z]{4})|([A-Z] [A-Z])
但是当使用重复操作符{[minLenght],[Maxlength]}
将fisrt树部分分组到一个表达式中时,表达式变为:
([A-Z]{2,4})|([A-Z] [A-Z])
括号中的顺序是指组顺序。