9

重複の可能性:
JAVA: 文字列に特殊文字が含まれているかどうかを確認します

私は初心者のプログラマーで、ある文字が特殊文字かどうかを判断するための助けを求めています。私のプログラムは、ユーザーにファイルの名前を入力するように要求し、プログラムはファイル内のテキストを読み取り、テキスト内の空白スペース、数字、文字、および特殊文字の数を判断します。空白、数字、および文字を判別するためのコードを完成させましたが、文字が特殊文字であるかどうかを確認する方法がわかりません。何かご不明な点がございましたら、詳しく説明させていただきます。これまでの私のコードは次のとおりです。

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++;
    }
  }
}
}

specialcharCount をインクリメントするために、最後に if ステートメントに何かを入れる必要があります。

4

4 に答える 4

15

このメソッドは、文字列に(定義に基づいて)特殊文字が含まれているかどうかをチェックします。

/**
 *  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 ]");
}

同じロジックを使用して、次のような文字列内の特殊文字をカウントできます。

/**
 *  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;
 }

別のアプローチは、すべての特殊文字を文字列に入れ、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;
 }

:バックスラッシュ"文字をバックスラッシュでエスケープする必要があり。


上記は、この問題に一般的に取り組む方法の例です。

質問に記載されている正確な問題については、@LanguagesNamedAfterCoffeeによる回答が最も効率的なアプローチです。

于 2012-10-14T19:54:20.117 に答える
5

クラスのjava.lang.Character静的メンバー メソッド (isDigit、isLetter、isLowerCase など)を見てみましょう。

例:

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;
   }
}
于 2012-10-14T19:45:58.767 に答える
2

正規表現を使用できます。

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

「特殊文字」の定義が、すでに持っている他のフィルターに適用されないものである場合は、単に。を追加できますelseelse ifこの場合も使用する必要があることに注意してください。

if(c == ' ') {
    blankCount++;
} else if (Character.isDigit(c)) {
    digitCount++;
} else if (Character.isLetter(c)) {
    letterCount++;
} else { 
  specialcharCount++;
}
于 2012-10-14T19:54:54.213 に答える
1

私がすること:

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++
    }
}

これは、特別なクラスをインポートする必要がない簡単な方法です。メソッドに貼り付けるか、メイン コードに直接挿入します。

ASCII チャート: http://www.gophoto.it/view.php?i=http://i.msdn.microsoft.com/dynimg/IC102418.gif#.UHsqxFEmG08

于 2012-10-14T21:20:40.383 に答える