質問するログイン新規登録

Q&A

解決済

3回答

20976閲覧

javaで半角入力されているかチェックする

hekomin

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/09/20 01:04

0

0

###前提・実現したいこと
入力された文字に半角が含まれているかのチェック処理を行いたいです。
正規法を使用し、実装しましたが、うまくでいませんでした。

###該当のソースコード
if (str.length() != bytes.length / 2) {
このようにバイト数での判定も試みましたが、うまくいきません。

###試したこと
javaでの半角チェックの方法を教えていただきたい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答3

0

ベストアンサー

###Unicodeの半角領域
http://www.unicode.org/charts/PDF/UFF00.pdf
Unicodeには互換性維持のため半角領域が定義されています。JIS -> Unicodeの変換でJavaに取り込まれたなら、Unicodeの半角文字として処理することができます。逆の変換 Unicode -> JIS もなりたちます。

半角領域は、\uff01 - \uff9f
半角カタカナは、\uff61 - \uff9f

文字コードは連続しています。

###正規表現

Java

1/** 正規表現 - 半角カタカナが含まれているか? */ 2static final String HAS_HALF_WIDTH_KANA = ".*[\\uff61-\\uff9f]+.*"; 3 4/** 正規表現 - すべて半角カタカナか? */ 5static final String IS_HALF_WIDTH_KANA = "^[\\uff61-\\uff9f]+$"; 6

###ユーティリティクラス
要件に合わせて正規表現やメソッドを追加してください。

Java

1public final class HalfWidthKatakana { 2 3 private HalfWidthKatakana() {} 4 5 /** 正規表現 - 半角カタカナが含まれているか? */ 6 static final String HAS_HALF_WIDTH_KANA = ".*[\\uff61-\\uff9f]+.*"; 7 8 /** 正規表現 - すべて半角カタカナか? */ 9 static final String IS_HALF_WIDTH_KANA = "^[\\uff61-\\uff9f]+$"; 10 11 public static boolean hasHalfWidthKana(String str) { 12 return str.matches(HAS_HALF_WIDTH_KANA); 13 } 14 15 public static boolean isHalfWidthKana(String str) { 16 return str.matches(IS_HALF_WIDTH_KANA); 17 } 18 19 /** 半角カタカナ文字の一覧 */ 20 public static final String HALF_WIDTH_KANA; 21 22 static { 23 char[] c = new char[0xff9f-0xff61+1]; 24 for (int i=0xff61; i<=0xff9f; ++i) { 25 c[(i-0xff61)] = (char) i; 26 } 27 HALF_WIDTH_KANA = new String(c); 28 } 29} 30 31

###テスト
テストケースを追加してください。バグがあったら遠慮なく指摘してください。

Java

1import org.junit.After; 2import org.junit.AfterClass; 3import org.junit.Before; 4import org.junit.BeforeClass; 5import org.junit.Test; 6import static org.junit.Assert.*; 7import static org.hamcrest.CoreMatchers.*; 8 9public class HalfWidthKatakanaTest { 10 11 public HalfWidthKatakanaTest() { 12 } 13 14 @BeforeClass 15 public static void setUpClass() { 16 } 17 18 @AfterClass 19 public static void tearDownClass() { 20 } 21 22 @Before 23 public void setUp() { 24 } 25 26 @After 27 public void tearDown() { 28 } 29 30 @Test 31 public void testHalfWidthKana() { 32 System.out.println("HalfWidthKana"); 33 System.out.println(HalfWidthKatakana.HALF_WIDTH_KANA); 34 int expResult = 0xff9f - 0xff61 + 1; 35 int result = HalfWidthKatakana.HALF_WIDTH_KANA.length(); 36 assertThat(result, is(expResult)); 37 } 38 39 @Test 40 public void testHasHalfWidthKana01() { 41 System.out.println("hasHalfWidthKana01"); 42 String str = HalfWidthKatakana.HALF_WIDTH_KANA; 43 boolean expResult = true; 44 boolean result = HalfWidthKatakana.hasHalfWidthKana(str); 45 assertThat(result, is(expResult)); 46 } 47 48 @Test 49 public void testHasHalfWidthKana02() { 50 System.out.println("hasHalfWidthKana02"); 51 String str = HalfWidthKatakana.HALF_WIDTH_KANA + "0120123AB"; 52 boolean expResult = true; 53 boolean result = HalfWidthKatakana.hasHalfWidthKana(str); 54 assertThat(result, is(expResult)); 55 } 56 57 @Test 58 public void testHasHalfWidthKana03() { 59 System.out.println("hasHalfWidthKana03"); 60 String str = ""; 61 boolean expResult = false; 62 boolean result = HalfWidthKatakana.hasHalfWidthKana(str); 63 assertThat(result, is(expResult)); 64 } 65 66 public void testHasHalfWidthKana04() { 67 System.out.println("hasHalfWidthKana04"); 68 String str = "01234abc"; 69 boolean expResult = false; 70 boolean result = HalfWidthKatakana.hasHalfWidthKana(str); 71 assertThat(result, is(expResult)); 72 } 73 74 @Test 75 public void testIsHalfWidthKana01() { 76 System.out.println("isHalfWidthKana01"); 77 String str = HalfWidthKatakana.HALF_WIDTH_KANA; 78 boolean expResult = true; 79 boolean result = HalfWidthKatakana.isHalfWidthKana(str); 80 assertThat(result, is(expResult)); 81 } 82 83 @Test 84 public void testIsHalfWidthKana02() { 85 System.out.println("IsHalfWidthKana02"); 86 String str = HalfWidthKatakana.HALF_WIDTH_KANA + "0120123AB"; 87 boolean expResult = false; 88 boolean result = HalfWidthKatakana.isHalfWidthKana(str); 89 assertThat(result, is(expResult)); 90 } 91 92 @Test 93 public void testIsHalfWidthKana03() { 94 System.out.println("isHalfWidthKana03"); 95 String str = ""; 96 boolean expResult = false; 97 boolean result = HalfWidthKatakana.isHalfWidthKana(str); 98 assertThat(result, is(expResult)); 99 } 100} 101

###実行環境
$ uname -a
Linux x201fedora 4.7.3-200.fc24.x86_64 #1 SMP Wed Sep 7 17:31:21 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

###訂正(追記)
間違いがあるので訂正します。上のこの部分を削除してください。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
半角領域は、\uff01 - \uff9f
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

半角文字の定義

  1. 半角文字のうちにUnicodeに変換できない文字がある。
    http://charset.7jp.net/jis.html

 まず、Unicodeに変換できたものだけを半角判定の対象にするべきか、という議論があります。
ここでは「Unicodeに変換できたものだけを半角判定の対象にする」とします。

  1. Unicodeに変換できた半角文字を次のように定義する
    半角英数記号 \u0020-\u007e http://unicode.org/charts/PDF/U0000.pdf
    半角カタカナ \uff61 - \uff9 http://unicode.org/charts/PDF/UFF00.pdf

Java

1public class HalfWidthCharacters { 2 3 public static final String FULL_WIDTH_NUMBERS; 4 public static final String FULL_WIDTH_ALPHABETS_UPPER; 5 public static final String FULL_WIDTH_ALPHABETS_LOWER; 6 public static final String FULL_WIDTH_SYMBOLS; 7 8 public static final String HALF_WIDTH_NUMBERS; 9 public static final String HALF_WIDTH_ALPHABETS_UPPER; 10 public static final String HALF_WIDTH_ALPHABETS_LOWER; 11 public static final String HALF_WIDTH_SYMBOLS; 12 public static final String HALF_WIDTH_KATAKANAS; 13 14 static { 15 FULL_WIDTH_NUMBERS = getCharacters(0xff10, 0xff19); 16 FULL_WIDTH_ALPHABETS_UPPER = getCharacters(0xff21, 0xff3a); 17 FULL_WIDTH_ALPHABETS_LOWER = getCharacters(0xff41, 0xff5a); 18 FULL_WIDTH_SYMBOLS = getCharacters(0xff00, 0xff0f) + 19 getCharacters(0xff1a, 0xff20) + 20 getCharacters(0xff3b, 0xff40) + 21 getCharacters(0xff5a, 0xff60); 22 23 HALF_WIDTH_NUMBERS = getCharacters(0x0030, 0x0039); 24 HALF_WIDTH_ALPHABETS_UPPER = getCharacters(0x0041, 0x005a); 25 HALF_WIDTH_ALPHABETS_LOWER = getCharacters(0x0061, 0x007a); 26 HALF_WIDTH_SYMBOLS = getCharacters(0x0020, 0x002f) + 27 getCharacters(0x003a, 0x0040) + 28 getCharacters(0x005b, 0x0060) + 29 getCharacters(0x007b, 0x007e); 30 HALF_WIDTH_KATAKANAS = getCharacters(0xff61, 0xff9f); 31 } 32 33 static String getCharacters(int from, int to) { 34 char[] c = new char[to - from + 1]; 35 for (int i=from; i<=to; ++i) { 36 c[i-from] = (char) i; 37 } 38 String s = new String(c); 39 return s; 40 } 41 42 public static void main(String[] args) { 43 System.out.println("全角文字"); 44 System.out.println(FULL_WIDTH_NUMBERS); 45 System.out.println(FULL_WIDTH_ALPHABETS_UPPER); 46 System.out.println(FULL_WIDTH_ALPHABETS_LOWER); 47 System.out.println(FULL_WIDTH_SYMBOLS); 48 System.out.println("半角文字"); 49 System.out.println(HALF_WIDTH_NUMBERS); 50 System.out.println(HALF_WIDTH_ALPHABETS_UPPER); 51 System.out.println(HALF_WIDTH_ALPHABETS_LOWER); 52 System.out.println(HALF_WIDTH_SYMBOLS); 53 System.out.println(HALF_WIDTH_KATAKANAS); 54 } 55}
  1. 半角文字判定用の正規表現

Java

1 2/** 正規表現 - 半角文字が含まれているか? */ 3static final String HAS_HALF_WIDTH_CHARACTERS =.*[\\u0020-\\u007e\\uff61-\\uff9f]+.*"; 4 5/** 正規表現 - すべて半角文字か? */ 6static final String IS_HALF_WIDTH_CHARACTERS = "^[\\u0020-\\u007e\\uff61-\\uff9f]+$"; 7

Windos環境で、\は¥です。

投稿2016/09/22 00:46

編集2016/09/23 11:10
退会済みユーザー

退会済みユーザー

総合スコア0

退会済みユーザー

退会済みユーザー

2016/09/22 03:06

8ビットASCIIに相当する半角文字が抜けていました。正規表現の文字に\u0020-\u007eを加えなければなりません。
guest

0

indexOf/lastIndexOfメソッド

半角が入っているかどうかだけであればindexOfを使えばよいのでは

半角スペースが含まれているか?と勘違いしていました。
以下のようなメソッドでどうでしょう。

java

1public static boolean isZenkakuOnly(String str) { 2 return str.matches("[^ -~。-゚]*"); 3}

投稿2016/09/20 01:12

編集2016/09/20 07:26
pinpikokun

総合スコア376

hekomin

2016/09/20 01:28

ご回答ありがとうございます。 indexOfメソッドを使用して、特定の文字を判断することができると書いてありますが、半角文字をチェックする際は、どのように行えばよろしいですか? お手数とは思いますが、 ご教授願います。
swordone

2016/09/20 07:18

このメソッドは正規表現使えないから面倒じゃないですかね
guest

0

Javaで全角・半角の判定
この辺が参考になりませんか?
あと、bytesではなく、str.getBytes()では?

投稿2016/09/20 01:09

swordone

総合スコア20675

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問