可能性のある複製:
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ステートメントを挿入する必要があります。
このメソッドは、ストリングに特殊文字(定義に基づく)が含まれているかどうかをチェックします。
/**
* 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による回答が最も効率的なアプローチです。
正規表現 を使用できます。
String input = ...
if (input.matches("[^a-zA-Z0-9 ]"))
「特殊文字」の定義が、既にある他のフィルターには適用されないものである場合は、else
を追加するだけです。この場合、else if
を使用する必要があることにも注意してください。
if(c == ' ') {
blankCount++;
} else if (Character.isDigit(c)) {
digitCount++;
} else if (Character.isLetter(c)) {
letterCount++;
} else {
specialcharCount++;
}
クラスを見てください 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;
}
}
私がすること:
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