web-dev-qa-db-fra.com

Vérifier si un caractère est un caractère spécial dans Java

Duplicata possible:
Java: vérifiez une chaîne s'il y a un caractère spécial

Je suis un programmeur débutant et je cherche de l'aide pour déterminer si un personnage est un personnage spécial. Mon programme demande à l'utilisateur d'entrer le nom d'un fichier, et le programme lit le texte dans le fichier et détermine le nombre d'espaces vides, de chiffres, de lettres et de caractères spéciaux dans le texte. J'ai le code complété pour déterminer les blancs, les chiffres et les lettres, mais je ne sais pas comment vérifier si un caractère est un caractère spécial. Toute aide que vous pouvez offrir est appréciée et si quelque chose n'était pas assez clair, je peux essayer de développer. Jusqu'à présent, mon code est:

import Java.util.Scanner;
import Java.io.*;

public class TextFile{

public static void main(String[] args){

  Scanner input = new Scanner (System.in);
  String fileName;
  boolean goodName = false;
  int blankCount = 0;
  int letterCount = 0;
  int digitCount = 0;
  int specialcharCount = 0;
  String currentLine;
  char c;
  Scanner lineFile= null;
  FileReader infile;

  System.out.println("Please enter the name of the file: ");
  fileName = input.nextLine();

  while (!goodName) {
    try{
      infile = new FileReader(fileName);
      lineFile = new Scanner(infile);

      goodName= true;
    }
    catch(IOException e) {
      System.out.println("Invalid file name, please enter correct file name: ");
      fileName=input.nextLine();
    }
  }

  while (lineFile.hasNextLine()){
    currentLine = lineFile.nextLine();
    for(int j=0; j<currentLine.length();j++){
      c=currentLine.charAt(j);
      if(c== ' ') blankCount++;
      if(Character.isDigit(c)) digitCount++;
      if(Character.isLetter(c)) letterCount++;
      if() specialcharCount++;
    }
  }
}
}

J'ai besoin de quelque chose à mettre dans l'instruction if à la fin pour incrémenter specialcharCount.

8
user1701604

Cette méthode vérifie si une chaîne contient un caractère spécial (basé sur votre définition).

/**
 *  Returns true if s contains any character other than 
 *  letters, numbers, or spaces.  Returns false otherwise.
 */

public boolean containsSpecialCharacter(String s) {
    return (s == null) ? false : s.matches("[^A-Za-z0-9 ]");
}

Vous pouvez utiliser la même logique pour compter les caractères spéciaux dans une chaîne comme celle-ci:

/**
 *  Counts the number of special characters in s.
 */

 public int getSpecialCharacterCount(String s) {
     if (s == null || s.trim().isEmpty()) {
         return 0;
     }
     int theCount = 0;
     for (int i = 0; i < s.length(); i++) {
         if (s.substring(i, 1).matches("[^A-Za-z0-9 ]")) {
             theCount++;
         }
     }
     return theCount;
 }

Une autre approche consiste à mettre tous les caractères spéciaux dans une chaîne et à utiliser String.contains :

/**
 *  Counts the number of special characters in s.
 */

 public int getSpecialCharacterCount(String s) {
     if (s == null || s.trim().isEmpty()) {
         return 0;
     }
     int theCount = 0;
     String specialChars = "/*!@#$%^&*()\"{}_[]|\\?/<>,.";
     for (int i = 0; i < s.length(); i++) {
         if (specialChars.contains(s.substring(i, 1))) {
             theCount++;
         }
     }
     return theCount;
 }

[~ # ~] note [~ # ~]: Vous devez échapper au barre oblique inverse et " caractère avec un barre oblique inverse.


Les exemples ci-dessus montrent comment aborder ce problème en général.

Pour votre problème exact, comme indiqué dans la question, la réponse de @LanguagesNamedAfterCoffee est l'approche la plus efficace.

12
jahroy

Vous pouvez utiliser expressions régulières .

String input = ...
if (input.matches("[^a-zA-Z0-9 ]"))

Si votre définition d'un "caractère spécial" est simplement tout ce qui ne s'applique pas aux autres filtres que vous avez déjà, vous pouvez simplement ajouter un else. Notez également que vous devez utiliser else if dans ce cas:

if(c == ' ') {
    blankCount++;
} else if (Character.isDigit(c)) {
    digitCount++;
} else if (Character.isLetter(c)) {
    letterCount++;
} else { 
  specialcharCount++;
}

Jetez un oeil à la classe Java.lang.Character méthodes membres statiques (isDigit, isLetter, isLowerCase, ...)

Exemple:

String str = "Hello World 123 !!";
int specials = 0, digits = 0, letters = 0, spaces = 0;
for (int i = 0; i < str.length(); ++i) {
   char ch = str.charAt(i);
   if (!Character.isDigit(ch) && !Character.isLetter(ch) && !Character.isSpace(ch)) {
      ++specials;
   } else if (Character.isDigit(ch)) {
      ++digits;
   } else if (Character.isSpace(ch)) {
      ++spaces;
   } else {
      ++letters;
   }
}
2
user586399

Ce que je ferais:

char c;
int cint;
for(int n = 0; n < str.length(); n ++;)
{
    c = str.charAt(n);
    cint = (int)c;
    if(cint <48 || (cint > 57 && cint < 65) || (cint > 90 && cint < 97) || cint > 122)
    {
        specialCharacterCount++
    }
}

C'est un moyen simple de faire les choses, sans avoir à importer de classes spéciales. Collez-le dans une méthode, ou mettez-le directement dans le code principal.

Graphique ASCII: http://www.gophoto.it/view.php?i=http://i.msdn.Microsoft.com/dynimg/IC102418.gif#.UHsqxFEmG08

0
Azulflame