javaでの文字判定方法とは

このQ&Aのポイント
  • javaでの文字判定方法について詳しく教えてください。
  • 特に16進数文字の判定方法について教えてください。
  • Stringやbyte配列、char配列などの場合での判定方法の違いも知りたいです。
回答を見る
  • ベストアンサー

javaでの文字判定

javaにおいて16進数文字判定はどのようにするのでしょうか? 例えばString文字列が16進数文字0-9,a-f,A-Fで構成されているかどうかを 判定するにはどのようにすれば良いのでしょうか? このString文字列の長さは事前には分からず、数文字かもしれないし 数百文字かもしれません c言語の場合だとchar配列xyz[]があって中身が"1234abc"の場合 isxdigit()を使ってループでisxdigit( xyz[i] )として1文字づつ判定しNUL文字が 出現すれば終了となるわけですがjavaの場合だとどうするのでしょう? Stringの場合、byte[]の場合、char[]の場合それぞれ教えてもらえると助かります。 よろしくお願いします。

  • Java
  • 回答数14
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

【正規表現】 正規表現を使う https://java-reference.com/java_string_regex.html 「find()」と「matches()」では挙動が違うので注意して下さい。 同一のPatternで多数のデータをチェックしたい場合は、「Pattern.compile(~)」をループの外に出した方が当然スーピードが早い。 下記は「Pattern.compile(~)」をループの外に出している例。 import java.util.regex.Pattern; public class test { public static void main(String[] args) { String reg = "[0-9a-fA-F]+"; String data[] = { "","789abc", "789ABC", "789ABCghi" }; Pattern p = Pattern.compile(reg); for(int i = 0; i<data.length; i++ ){ System.out.println( "i=" + i + "; " + "data[i]=\"" + data[i] + "\"; " + "p.matcher(data[i]).matches( )=" + p.matcher(data[i]).matches( ) + "; " + ""); } } } 実行結果 i=0; data[i]=""; p.matcher(data[i]).matches( )=false; i=1; data[i]="789abc"; p.matcher(data[i]).matches( )=true; i=2; data[i]="789ABC"; p.matcher(data[i]).matches( )=true; i=3; data[i]="789ABCghi"; p.matcher(data[i]).matches( )=false;

miiom1018
質問者

お礼

ご親切にサンプルまで示していただいたのでamanojaku1へ ベストアンサーを差し上げます。

その他の回答 (13)

回答No.14

処理スピードの速い順。 (1).正規表現。 (2).「.toCharArray()」で一括変換し配列で処理。 (3).一文字 一文字「.charAt(~)」で変換 「(1)、(3)」は既に投稿してあります。 下記は「(2)」です。 public class test { public static void main(String[] args) { String data[] = { "","789abc", "789ABC", "789ABCghi" }; for(int i = 0; i<data.length; i++ ){ System.out.println( "i=" + i + "; " + "data[i]=\"" + data[i] + "\"; " + "CheckHex(data[i])=" + CheckHex(data[i]) + "; " + ""); } } static boolean CheckHex(String check){ boolean hex = false; // true char[] ca = check.toCharArray(); for(int i = 0; i<ca.length; i++ ){ char c = ca[i]; if( '0'<=c & c<='9' | 'a'<=c & c<='f' | 'A'<=c & c<='F' ){ hex = true; // false }else{ hex = false; // true break; } } return hex; } }

回答No.13

> // 実は「Shift JIS」と「Windows-31j」はビミョウに違うので、ビミョウに違った変換になってしまうので要注意。 > > // Windowsファイル用データを「Java String」(UTF16)データに変換。 > JavaUTF16 = new String(WinFileByte, Charset.forName("Windows-31j")); > > // 「Java String」(UTF16)データをWindowsファイル用データに変換。 > WinFileByte = JavaUTF16.getBytes(Charset.forName("Windows-31j")); Windowsファイル用データを使う場合には下記のように「Shift_JIS」を使ってはならない。 String JavaUTF16 = new String(WinFileByte, Charset.forName("Shift_JIS")); WinFileByte = JavaUTF16.getBytes(Charset.forName("Shift_JIS"));

回答No.12

>byte[]の場合、char[]の場合それぞれ教えてもらえると助かります。 基本的に変換すれば良いですが、byte型は少々 面倒です。 byte型が使われる場合は、主にファイルの入出力です、例えばWindowsが出力した「Shift JIS」ファイルを読み込みたいとか、Windows用に「Shift JIS」ファイルを書き出したいとか言う場合でしょう。 Javaは内部的に文字エンコーディングとしてUTF-16のようです。 import java.nio.charset.Charset; byte WinFileByte[] = null; String JavaUTF16 = null; // ここでWinFileByte[] にWindowsファイルを読み込んだとする。 // 実は「Shift JIS」と「Windows-31j」はビミョウに違うので、ビミョウに違った変換になってしまうので要注意。 // Windowsファイル用データを「Java String」(UTF16)データに変換。 JavaUTF16 = new String(WinFileByte, Charset.forName("Windows-31j")); // 「Java String」(UTF16)データをWindowsファイル用データに変換。 WinFileByte = JavaUTF16.getBytes(Charset.forName("Windows-31j")); 参考 ‘愛’で学ぶ文字コードと文字化けの常識 http://www.atmarkit.co.jp/ait/articles/0706/21/news129.html http://www.atmarkit.co.jp/ait/articles/0706/21/news129_2.html

回答No.11

>String型では「==」はアドレス(ポインター)の判定になります。 String型で「==」はポインターが「null」か どうかを判定する時に使います。

回答No.10

>>>String型で文字判定をする場合「<、>、==、、<=、>=」は使えません、、String型で文字判定をする場合、「.equals(~)」しか使えません(初心者がハマリやすいところです)。 >>特に「==」はエラーにならないので要注意です。 >「==」はエラーにならないので、一見 使えてるように思えてしまいますが、正常に文字列を判定できません。 String型では「==」はアドレス(ポインター)の判定になります。 同じ文字列は同じアドレス(ポインター)としている処理系なら「==」で正常に文字列を判定できるでしょうが(そんな事は期待しては いけません)。

回答No.9

>>String型で文字判定をする場合「<、>、==、、<=、>=」は使えません、、String型で文字判定をする場合、「.equals(~)」しか使えません(初心者がハマリやすいところです)。 >特に「==」はエラーにならないので要注意です。 「==」はエラーにならないので、一見 使えてるように思えてしまいますが、正常に文字列を判定できません。

回答No.8

>String型で文字判定をする場合「<、>、==、、<=、>=」は使えません、、String型で文字判定をする場合、「.equals(~)」しか使えません(初心者がハマリやすいところです)。 特に「==」はエラーにならないので要注意です。

回答No.7

一文字 一文字 処理したい場合 >回答No.6 amanojaku1 String型で文字判定をする場合「<、>、==、、<=、>=」は使えません、、String型で文字判定をする場合、「.equals(~)」しか使えません(初心者がハマリやすいところです)。 「'~'」のようにシングル・クォーテーションで囲むとchar型になります(String型ではないので注意して下さい)。 あくまでも下記はjavaの勉強のためです、実際のプログラムには正規表現を お使い下さい。

回答No.6

public class test { public static void main(String[] args) { String data[] = { "","789abc", "789ABC", "789ABCghi" }; for(int i = 0; i<data.length; i++ ){ System.out.println( "i=" + i + "; " + "data[i]=\"" + data[i] + "\"; " + "CheckHex(data[i])=" + CheckHex(data[i]) + "; " + ""); } } static boolean CheckHex(String check){ boolean hex = false; // true for(int i = 0; i<check.length(); i++ ){ char c = check.charAt(i); if( '0'<=c & c<='9' | 'a'<=c & c<='f' | 'A'<=c & c<='F' ){ hex = true; // false }else{ hex = false; // true break; } } return hex; } }

回答No.5

一文字 一文字 処理したい場合 String型で文字判定をする場合、「.equals(~)」しか有りません、つまりString型では文字の大小と言う概念が排除されています。 (回答No.2 pringlezさんの仰るとおり)String型を「.charAt(~)」でchar型に変換して処理すれば良いでしょう(char型は16ビット(2バイト)の符号なし整数)。

関連するQ&A

  • 2byte文字の判定

    お世話になります。 2バイト文字かどうかの判定のやり方ですが、 String a = "";//←判定したい1文字(とりあえずStringとします) byte[] b = a.getByte(); if((int)b[0]<0){ //2byte文字 }else{ //1byte文字 } という判定の方法はありですか? それとも根本的に考え方間違えてますでしょうか??

    • ベストアンサー
    • Java
  • javaというか文字列について少し質問です><

    javaというか文字列について少し質問です>< javaというか文字列について少し質問です>< お願いします。 シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・ String decrypt(String str,int key) { StringBuffer sb = new StringBuffer(); // もしくはStringBuilder for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); sb.append( c ); } こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

    • ベストアンサー
    • Java
  • javaの文字コードについて

    いつもお世話になっております。 webで入れられた文字列に全角が含まれるか判定したいのですが、 文字コードについて質問させてください。 javaは標準では、String型は標準ではunicodeだと思うのですが、 これはutf-8なのでしょうか。utf-16なのでしょうか。 試しに以下のように"A"の文字をbyteに変換してみたところ、 String strTest = "A"; byte[] bbb = strTest.getBytes(); for(int i = 0 ; i < bbb.length ; i++){ System.out.println(bbb[i]); } "65"という結果が返ってきました。 http://ash.jp/code/unitbl1.htm 等文字コード表を見ると、"A"は"41"と定義されており、なぜ"65"が返ってくるのでしょうか。 変な質問ですいません。 関係無いと思いますが、ソースはS-JIS、windwos環境で実行しています。 よろしくお願いします。

    • ベストアンサー
    • Java
  • String型の値が大文字か小文字か判定する

    いつもお世話になっています。 String型の値が、大文字か小文字か判定することはできないのでしょうか? char型だと Charactereクラスを使用し判定が可能なのですが。 ◆char型の場合◆ List list = new ArrayList(); //比較する文字列 String mozi = "Abc"; //ループ for(int m=0;m<mozi.length();m++) { //文字を順に小文字かどうか調べる char ccc = mozi.charAt(m); //小文字の場合に限りlistに格納 if(Character.isLowerCase(ccc) == true) { list.add(ccc); } } //表示 for(int l=0;l<list.size();l++) { System.out.println("list="+list.get(l)); } したいのが、 ◆String型◆ List list = new ArrayList(); List list2 = new ArrayList(); list.add("TEST"); list.add("sam"); list.add("OSIETE"); for(int l=0;l<list.size();l++ ) { String compareMozi =(String) list.get(l); //ここで文字列compareMoziが大文字か小文字か調べて、小文字のときだけlist2に格納する } な感じです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • JAVA Servlet での全角文字判定

    JAVAでの文字列判定で、全角文字以外を入力した場合は、エラーとして扱いたいのですが、その方法がわかりません。 教えてください。よろしくお願いします。

  • javaで文字変換したいんです。

    たとえば "82 A0 82 A2 82 A4 41 42 43 82 A6 82 A8 " という文字列を "あいうABCえお"に変換したい場合どのようにすればいいのでしょう? 変換前の文字コードはS-JISとします。 変換前の文字列はStringに入っているものとします。 String str="82 A0 82 A2 82 A4 41 42 43 82 A6 82 A8 "; //こんな感じ java は初めてで困ってます。 Cなら何とかなるんですが・・・ どうかお知恵をお授けください。

    • ベストアンサー
    • Java
  • strtokでの空文字への置き換え

    大したことじゃないと言えばそうかもしれませんが、ちょっと氣になるんで質問させてください。 C言語でstrtokという函數ありますよね。 第1引數の文字列を、第2引數の文字列を構成する文字で區切る。 第2引數の文字を見つけたら、それを空文字('¥0')に置き換える。 字句の最初の文字へのポインタを返す。 このようなものだと理解しています。 次のプログラムを實行してみました。 #include <stdio.h> #include <string.h> int main(void) { char string[]="XYZ1231ABC"; int i; printf("%s\n", string); putchar('\n'); printf("%s\n", strtok(string, "1A")); printf("%s\n", strtok(NULL, "1A")); printf("%s\n", strtok(NULL, "1A")); printf("%s\n", strtok(NULL, "1A")); putchar('\n'); for(i=0; i<=10; i++) printf("string[%d]=%c\n", i, string[i]); return 0; } 結果 XYZ1231ABC XYZ 23 BC (null) string[0]=X string[1]=Y string[2]=Z string[3]= string[4]=2 string[5]=3 string[6]= string[7]=A string[8]=B string[9]=C string[10]= 私が思うには、string[7]は空文字に置き換わってしまうはずだと思うんですが、 結果は'A'のままです。 ここが '¥0'に置き換わるかどうかは しょり系によって異なるのでしょうか。

  • Javaの文字列の大小比較についてです。

    Javaでは、文字列の大小比較をする時、StringのcompareToを使用しまが… compareToの中の処理は一旦char型に直して、それを比較しているのでしょうか? また、compareToを使用せずに、プログラム内に自分で書いた場合、処理速度は変化ありますか?

    • ベストアンサー
    • Java
  • EUC_JPの文字化け

    指定された文字列(String型)を以下の様にバイト配列で保持し、 byte[] work = "指定文字列".getBytes(encoding); そのバイト配列を使用し、再度、以下の様にStringを生成します。 new String(work, encoding); (作成したプログラムを添付したいのですが、文字数の関係で割愛します。) 指定文字列は機種依存文字(丸数字等)にします。 この時、encodingにMS932、UTF-8等を指定した場合は問題なく元の文字列が 取得できますが、EUC_JPを指定すると、?に文字化けを起こします。 調査すると、getBytesでbyte配列を取得した時点で既に変換不良を起こしていました。 (丸数字全てが0x3fになっていました。期待していたコード、というか本来は、0xADA1~0xADB4のはずです。) そこでStringクラスのgetBytesメソッドをオーバーライドしちゃえという、甘い考えが浮かび、 javaのソースコードでString.javaを見ましたが、結局のところ、どこでコード変換を行っているのか よくわかりませんでした。 そこで質問です。 1)これはJDKのバグなのですか? 2)こんな経験がある。あるいはこういう対処をした。というかた、おりましたら、   参考URLでも構いませんが教えてください。 以上、よろしくお願いします。

  • javaの正規表現について質問です。

    javaの正規表現matchesに関して質問です。 正規表現を用いて文字列が半角数字のみで出来ているかどうかを判定したいと思っています。 調べたとろこ下記の正規表現で判定できそうなのですが、 正規表現のルールが理解できず困っています。 ------------------------------------------- String aaa = "0123456789"; //パターン1 aaa.matches("^[0-9]{10,11}$"); //パターン2 aaa.matches("^[0-9]+$") ------------------------------------------- パターン1 ^[0-9]   →  文字列の先頭が0~9か判定 {10,11}   →  10~11回繰り返す(繰り返すというのは[0-9]かどうかということでしょうか?)           12文字目に文字を入れた下記文字列でもfalseが返ってきました。           解釈が間違えている?           String aaa = "0123456789a"; $      →  文字列の最後が[0-9]を10~11回繰り返しているかどうか? パターン2 ^[0-9]   →  文字列の先頭が0~9か判定 +$ →  文字列の最後が???? すいません自分で書いてて混乱してきました。 どなたかアドバイス下さい。

    • ベストアンサー
    • Java

専門家に質問してみよう