2009-05-25 5 views

Répondre

12

Ce n'est pas un langage courant, et donc il ne peut pas être capturé par une regex vanille. Il est peut-être possible de toute façon, mais il sera certainement plus facile de ne pas utiliser une expression régulière:

public static boolean moreDigitsThanNonDigits(String s) { 
    int diff = 0; 
    for(int i = 0; i < s.length(); ++i) { 
     if(Character.isDigit(s.charAt(i))) ++diff; 
     else --diff; 
    } 
    return diff > 0; 
} 
0

Je ne suis pas sûr que l'utilisation des expressions régulières serait ici la meilleure solution.

+0

Je n'insiste pas sur l'utilisation de l'expression régulière, je dois identifier les chaînes en quelque sorte. –

10

Vous ne serez pas en mesure d'écrire une expression rationnelle qui fait cela. Mais vous avez déjà dit que vous utilisez Java, pourquoi ne pas mélanger un peu de code? Regex seul ne peut pas (puisqu'ils ne comptent rien);

public boolean moreDigitsThanNonDigits(String input) { 
    String nonDigits = input.replace("[0-9]",""); 
    return input.length() > (nonDigits.length * 2); 
} 
+0

Salut, Pouvez-vous s'il vous plaît clarifier mon doute, en utilisant java.util.regex pacakgae, vais-je être en mesure de rechercher le tout type de modèle dans les fichiers texte ou dans tout type de format de fichier? – gmhk

+0

Les diverses méthodes java.lang.String 'replace ...' peuvent déjà accepter regex. Pas besoin d'apporter vos propres instances Pattern, Matcher, etc. –

0

mais si vous voulez les utiliser, utilisez seulement deux remplacements: un qui supprime tous les chiffres et un qui ne les garde que. puis comparez les longueurs de chaîne des résultats.

Bien sûr, je préfère utiliser la réponse de Dave.

+0

Salut, Pouvez-vous s'il vous plaît clarifier mon doute, en utilisant java.util.regex pacakgae, vais-je être en mesure de rechercher le type quelconque de modèle dans les fichiers texte ou dans tout type de format de fichier? – gmhk

+0

Étant donné que les expressions régulières sont utilisées pour comparer les modèles dans une chaîne, alors mon doute si google recherche le concept de modèles à rechercher dans tous les fichiers? – gmhk

+0

Google fait beaucoup plus que simplement comparer regex à certains fichiers. –

3

Les expressions régulières ne sont théoriquement pas capables de préformer une telle tâche. Ils sont équivalents aux langages formels ou aux automates (réguliers). Ils n'ont aucune notion de mémoire (ou de pile), ils ne peuvent donc pas compter les occurrences de symboles. Les extensions suivantes en termes d'expressivité sont les automates à bascule (ou machines à pile), qui correspondent à des grammaires sans contexte. Avant d'écrire un tel grammeur pour cette tâche, l'utilisation d'une méthode comme la moreDigitsThanNonDigits ci-dessus serait appropriée.

+2

Les expressions régulières de style Perl (et Java) sont en réalité plus puissantes que les langues normales, en raison de la syntaxe "\ number" pour le retour en arrière sur un groupe capturé. Ils peuvent reconnaître les langues qui ne sont pas régulières. Par exemple, la langue de n'importe quelle chaîne répétée deux fois (qui n'est pas régulière, ni même sans contexte) peut être reconnue par "(. *) \ 1". – newacct

+0

Merci de le signaler! Votre exemple serait "(. *) \ 1 \ 1", n'est-ce pas? Mais les comparaisons de longueur ne sont toujours pas possibles, je suppose. – miku

1

Comme déjà mentionné, la langue en question n'est pas régulière et ne peut pas être détectée en utilisant une expression régulière.

Je vais vous donner un moyen supplémentaire de compter le nombre de chiffres et le nombre de non-chiffres dans une chaîne en utilisant regex !!

Vous pouvez utiliser la méthode String.replaceAll pour supprimer tous les non-chiffres dans la chaîne d'entrée. La longueur de la chaîne résultante sera le nombre de chiffres dans l'entrée.

De même, vous pouvez supprimer tous les chiffres de la chaîne d'entrée et la longueur de la chaîne résultante sera le nombre de non-chiffres dans la chaîne d'entrée.

public static boolean test(String str) { 
     int numDigits = str.replaceAll("\\D","").length(); 
     int numNonDigits = str.replaceAll("\\d","").length(); 

     return numDigits > numNonDigits; 
} 

Ideone Link

Questions connexes