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);
}
}
Vous n'avez pas appelé matches
ou find
dans le gestionnaire. Il n'a fait aucun travail.
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.
Cela ne fonctionne pas parce que vous avez 2 problèmes:
"[A-Z]"
pour ASCII lettre ou \p{Lu}
pour les lettres majuscules Unicode.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;
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);
}
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++;
}
}
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.
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);
}
}
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);
}
}