字符串中UpperCase字母的正则表达式

时间:2013-12-18 15:12:27

标签: java regex

对于我的生活,我无法弄清楚为什么这个正则表达式不起作用。它应该在给定的字符串中找到大写字母并给我计数。欢迎任何想法。

这是单元测试代码:

public class RegEx {

    @Test
    public void testCountTheNumberOfUpperCaseCharacters() {
        String testStr = "abcdefghijkTYYtyyQ";
        String regEx = "^[A-Z]+$";

        Pattern pattern = Pattern.compile(regEx);

        Matcher matcher = pattern.matcher(testStr);

        System.out.printf("Found %d, of capital letters in %s%n", matcher.groupCount(), testStr);

    }
}

8 个答案:

答案 0 :(得分:16)

它不起作用,因为你有两个问题:

  1. 正则表达式不正确,对于ASCII字母应为"[A-Z]",对于Unicode大写字母应为\p{Lu}
  2. 您未在while (matcher.find())
  3. 之前致电matcher.groupCount()

    正确的代码:

    public void testCountTheNumberOfUpperCaseCharacters() {
        String testStr = "abcdefghijkTYYtyyQ";
        String regEx = "(\\p{Lu})";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(testStr);
        while (matcher.find())
            System.out.printf("Found %d, of capital letters in %s%n", 
              matcher.groupCount(), testStr);
    
    }
    

    更新:使用更简单的单行代码来计算字符串中Unicode大写字母的数量:

    int countuc = testStr.split("(?=\\p{Lu})").length - 1;
    

答案 1 :(得分:10)

  1. 您没有在匹配器上调用matchesfind。它没有做任何工作。

  2. getGroupCount是错误的调用方法。你的正则表达式没有捕获组,即使它没有,它也不会给你字符数。

  3. 你应该使用find,但使用不同的正则表达式,没有锚点。我还建议使用正确的Unicode字符类:"\\p{Lu}+"。在while (m.find())循环中使用此功能,并累计每一步从m.group(0).length()获得的字符总数。

答案 2 :(得分:6)

这应该做你想要的,

@Test
public void testCountTheNumberOfUpperCaseCharacters() {
  String testStr = "abcdefghijkTYYtyyQ";
  String regEx = "[A-Z]+";
  Pattern pattern = Pattern.compile(regEx);
  Matcher matcher = pattern.matcher(testStr);
  int count = 0;
  while (matcher.find()) {
    count+=matcher.group(0).length();
  }
  System.out.printf("Found %d, of capital letters in %s%n", count, testStr);
}

答案 3 :(得分:3)

  

它应该在给定的字符串中找到大写字母并给我计数。

不,它不应该:^$锚点阻止它这样做,强制查找由完全组成的大写字符的非空字符串

此外,您不能指望未定义组的表达式中的组计数不是零(不匹配)或一个(单个匹配)。

如果您坚持使用正则表达式,请使用没有锚点的简单[A-Z]表达式,并在循环中调用matcher.find()。但是,更好的方法是在字符串的字符上调用Character.isUpperCase并计算命中数:

int count = 0;
for (char c : str.toCharArray()) {
    if (Character.isUpperCase(c)) {
        count++;
    }
}

答案 4 :(得分:1)

您编写的图案在行的开头和结尾之间查找一个或多个大写字母...如果该行中有任何小写字符,则它不会匹配。< / p>

答案 5 :(得分:0)

在这个例子中,我使用正则表达式(正则表达式)来计算给定字符串中使用Java的UpperCase和LowerCase字母的数量。

import java.util.regex.*;
import java.util.Scanner;
import java.io.*;
public class CandidateCode {
    public static void main(String args[] ) throws Exception {
        Scanner sc= new Scanner(System.in);
    //  Reads the String of data entered in a line
        String str = sc.nextLine();

    //counts uppercase letteres in the given String 
        int countuc = str.split("([A-Z]+?)").length; 

    //counts lowercase letteres in the given String 
        int countlc = str.split("([a-z]+?)").length; 

        System.out.println("UpperCase count: "+countuc-1);
        System.out.println("LowerCase count: "+countlc-1);
   }
}

答案 6 :(得分:0)

将正则表达式更改为 [A-Z] 检查所有出现的大写字母

请参考以下示例,该示例使用模式

计算字符串中的大写字母数
@Test
public void testCountTheNumberOfUpperCaseCharacters() {
    Pattern ptrn = Pattern.compile("[A-Z]");
    Matcher matcher = ptrn.matcher("ivekKVVV");
    int from = 0;
    int count = 0;
    while(matcher.find(from)) {
        count++;
        from = matcher.start() + 1;
    }
    System.out.println(count);
}

}

答案 7 :(得分:0)

您还可以使用Java Regex,例如:

.+[\p{javaUpperCase}].+ 

我的工作项目中的一个示例: RegEx Result Image