B-Teck!

お仕事からゲームまで幅広く

【JavaScript】半角の文字を判定する

正規表現

半角文字列の判定として「/[^\x01-\x7E]/」を使う。
[]の中に含まれる先頭のキャレット^は否定の意なので、
この場合はASCIIコードの「x01x7Eの範囲外の文字列」という意味になる。 これだけではカナは含まれないため、同様に「/[^\uFF65-\uFF9F]/」。
これはUTF-16の「半角中黒(FF65)~半濁点(FF9F)の範囲外の文字列」となる。

String.prototype.match

String.prototype.matchは文字列から正規表現にマッチングした文字を配列で返す関数で、
マッチングするものが無ければnullを返す。
value.match(/[\uFF65-\uFF9F]/gi)のようにgフラグ(グローバルフラグ)をつければ
マッチングした文字全てを配列として返すが、
デフォルトでは最初にマッチングした文字のみを返却する。

つまり、「全角の文字」が入力文字列に含まれていた場合は要素のある配列が返され、
!で評価を反転させることでfalseとなる。
逆に、「半角の文字」が含まれていた場合match()はnullを返すので、
!で評価を反転させることでtrueとなる。

function isHankaku(value){
    return !value.match(/[^\x01-\x7E]/) || !value.match(/[^\uFF65-\uFF9F]/);
}
function isHankakuKana(value){
    return !value.match(/[^\uFF65-\uFF9F]/);
}

console.log("---------------------------------------------");
console.log("isHankaku     : ");
console.log("あ            : " + isHankaku("あ"));
console.log("-             : " + isHankaku("-"));
console.log("ア             : " + isHankaku("ア"));
console.log("A             : " + isHankaku("A"));
console.log("あいうえオ     : " + isHankaku("あいうえオ"));
console.log("アイウエオ         : " + isHankaku("アイウエオ"));
console.log("---------------------------------------------");
console.log("isHankakuKana : ");
console.log("あ            : " + isHankakuKana("あ"));
console.log("-             : " + isHankakuKana("-"));
console.log("ア             : " + isHankakuKana("ア"));
console.log("A             : " + isHankakuKana("A"));
console.log("あいうえオ     : " + isHankakuKana("あいうえオ"));
console.log("アイウエオ         : " + isHankakuKana("アイウエオ"));
console.log("---------------------------------------------");

// 結果
//---------------------------------------------  
//isHankaku     :   
//あ            : false  
//-             : true  
//ア             : true  
//A             : true  
//あいうえオ     : false  
//アイウエオ         : true  
//---------------------------------------------  
//isHankakuKana :   
//あ            : false  
//-             : false  
//ア             : true  
//A             : false  
//あいうえオ     : false  
//アイウエオ         : true  
//---------------------------------------------