web-dev-qa-db-fra.com

Expression régulière pour les lettres UpperCase dans une chaîne

Pour ma vie, je ne peux pas comprendre pourquoi cette expression régulière ne fonctionne pas. Il devrait trouver des lettres majuscules dans la chaîne donnée et me donner le compte. Toutes les idées sont les bienvenues.

Voici le code de test unitaire:

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);

    }
}
9
David
  1. Vous n'avez pas appelé matches ou find dans le gestionnaire. Il n'a fait aucun travail.

  2. getGroupCount est la mauvaise méthode à appeler. Votre regex n'a pas de groupe de capture, et même si c'était le cas, cela ne vous donnerait pas le nombre de personnages.

Vous devriez utiliser find, mais avec une expression régulière différente, sans ancres. Je vous conseillerais également d'utiliser la classe de caractères Unicode appropriée: "\\p{Lu}+". Utilisez ceci dans une boucle while (m.find()) et accumulez le nombre total de caractères obtenus à partir de m.group(0).length() à chaque étape.

10
Marko Topolnik

Cela ne fonctionne pas parce que vous avez 2 problèmes:

  1. L'expression régulière est incorrecte, il devrait s'agir de "[A-Z]" pour ASCII lettre ou \p{Lu} pour les lettres majuscules Unicode.
  2. Vous n'appelez pas while (matcher.find()) avant matcher.groupCount()

Code correct:

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);

}

UPDATE: Utilisez ceci code beaucoup plus simple à une ligne pour compter le nombre de lettres majuscules Unicode dans une chaîne:

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

Cela devrait faire ce que vous recherchez, 

@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);
}
6
M21B8

Il devrait trouver des lettres majuscules dans la chaîne donnée et me donner le compte.

Non, cela ne devrait pas: les ancres ^ et $ l'en empêchent, ce qui oblige à chercher une chaîne non vide composée entièrement de caractères majuscules.

De plus, vous ne pouvez pas vous attendre à ce que le nombre de groupes dans une expression ne définissant pas les groupes soit autre que zéro (pas de correspondance) ou un (une seule correspondance).

Si vous insistez pour utiliser une expression rationnelle, utilisez une simple expression [A-Z] sans ancre et appelez matcher.find() dans une boucle. Cependant, une meilleure approche consiste à appeler Character.isUpperCase sur les caractères de votre chaîne et à compter les hits:

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

Votre modèle, tel que vous l'avez écrit, recherche 1 ou plusieurs lettres majuscules entre le début et la fin de la ligne ... s'il y a des caractères minuscules dans la ligne, ils ne correspondront pas.

1
James Gawron

Dans cet exemple, j'utilise une expression rationnelle (expression régulière) pour compter le nombre de lettres UpperCase et LowerCase dans la chaîne donnée en utilisant Java.

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);
   }
}
0
ganesh konathala

Remplacez l'expression régulière par [A-Z] qui vérifie toutes les occurrences de lettres majuscules

Veuillez vous reporter à l'exemple ci-dessous qui compte le nombre de lettres majuscules dans une chaîne à l'aide de pattern

@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);
}

}

0
vivekkurien