###前提・実現したいこと
入力された文字に半角が含まれているかのチェック処理を行いたいです。
正規法を使用し、実装しましたが、うまくでいませんでした。
###該当のソースコード
if (str.length() != bytes.length / 2) {
このようにバイト数での判定も試みましたが、うまくいきません。
###試したこと
javaでの半角チェックの方法を教えていただきたい。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
半角文字の定義
- 半角文字のうちにUnicodeに変換できない文字がある。
http://charset.7jp.net/jis.html
まず、Unicodeに変換できたものだけを半角判定の対象にするべきか、という議論があります。
ここでは「Unicodeに変換できたものだけを半角判定の対象にする」とします。
- 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}
- 半角文字判定用の正規表現
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
0
半角が入っているかどうかだけであればindexOfを使えばよいのでは
半角スペースが含まれているか?と勘違いしていました。
以下のようなメソッドでどうでしょう。
java
1public static boolean isZenkakuOnly(String str) { 2 return str.matches("[^ -~。-゚]*"); 3}
投稿2016/09/20 01:12
編集2016/09/20 07:26総合スコア376
2016/09/20 07:18
0
Javaで全角・半角の判定
この辺が参考になりませんか?
あと、bytesではなく、str.getBytes()では?
投稿2016/09/20 01:09
総合スコア20675
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
退会済みユーザー
2016/09/22 03:06