【JavaScript】アルファベットの大文字・小文字を判定する方法|toUpperCase・正規表現・charCodeAtの使い分け

JavaScriptで「この文字は大文字か小文字か」を判定したい場面はよくあります。入力チェック・変数名の検証・テキスト整形などで使います。

判定方法は大きく2系統あります。toUpperCase() を使う方法(全角やアクセント付き文字も判定できる)と、正規表現・charCodeAt() を使う方法(ASCIIのA〜Z/a〜zに限定)です。目的に応じて使い分けます。

この記事の結論:幅広い文字(全角A・アクセント付きA等)も判定したいなら toUpperCase() 方式、ASCIIのA〜Zだけを厳密に見たいなら正規表現 /[A-Z]/ を使います。
スポンサーリンク

1文字を判定する(toUpperCase方式・推奨)

「大文字に変換しても変わらず、かつ小文字に変換すると変わる」なら大文字、と判定します。2つ目の条件が重要で、数字や記号のような大小の区別がない文字を除外します。

toUpperCase / toLowerCase で判定
function isUpperCase(char) {
  return char === char.toUpperCase() && char !== char.toLowerCase();
}
function isLowerCase(char) {
  return char === char.toLowerCase() && char !== char.toUpperCase();
}

console.log(isUpperCase("A")); // true
console.log(isUpperCase("a")); // false
console.log(isLowerCase("a")); // true
console.log(isUpperCase("1")); // false(数字は大小の区別がない → 除外)
console.log(isUpperCase("A")); // true(全角の大文字も判定できる)
console.log(isUpperCase("É")); // true(アクセント付きも判定できる)
char !== char.toLowerCase() を付けないと、数字「1」や記号「@」も"1" === "1".toUpperCase()true になり「大文字」と誤判定してしまいます。このガードでアルファベット(大小の区別がある文字)だけに絞れます。

正規表現・charCodeAt で判定する(ASCII限定)

ASCIIのA〜Z/a〜zだけ」を厳密に判定したいなら正規表現や文字コードの範囲を使います。全角Aやアクセント付きは対象外になる点に注意してください。

正規表現で判定
const isUpperAscii = (c) => /[A-Z]/.test(c);
const isLowerAscii = (c) => /[a-z]/.test(c);

console.log(isUpperAscii("A")); // true
console.log(isUpperAscii("A")); // false(全角は対象外)
console.log(isLowerAscii("a")); // true
charCodeAt の範囲で判定
function isUpperCode(char) {
  const code = char.charCodeAt(0);
  return code >= 65 && code <= 90;  // "A"(65) 〜 "Z"(90)
}
function isLowerCode(char) {
  const code = char.charCodeAt(0);
  return code >= 97 && code <= 122; // "a"(97) 〜 "z"(122)
}

console.log(isUpperCode("A")); // true
console.log(isLowerCode("z")); // true

文字列レベルで判定する

1文字ではなく文字列全体を判定したいケースです。

全部大文字か / 含むか / 数える
// 全部大文字か(アルファベットを含み、小文字が無い)
function isAllUpperCase(str) {
  return str === str.toUpperCase() && str !== str.toLowerCase();
}
console.log(isAllUpperCase("HELLO"));    // true
console.log(isAllUpperCase("Hello"));    // false
console.log(isAllUpperCase("HELLO123")); // true(数字が混ざってもOK)
console.log(isAllUpperCase("123"));      // false(アルファベットが無い)

// 大文字を含むか
const hasUpper = (str) => [...str].some(isUpperCase);
console.log(hasUpper("hello"));  // false
console.log(hasUpper("heLlo"));  // true

// 大文字の数を数える
const countUpper = (str) => [...str].filter(isUpperCase).length;
console.log(countUpper("HeLLo")); // 3

先頭の1文字だけ大文字にする(capitalize)

判定とあわせてよく使う、先頭だけ大文字にする処理です。

先頭を大文字に
function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}
console.log(capitalize("hello")); // "Hello"

// 正規表現でも書ける
const capitalize2 = (str) => str.replace(/^./, (c) => c.toUpperCase());
console.log(capitalize2("world")); // "World"
大文字・小文字をまとめて変換したい場合は大文字・小文字を変換する方法を参照してください。

【注意】Unicodeのエッジケース

toUpperCase() 方式は便利ですが、Unicodeには変換で文字数が変わるロケールで結果が変わる文字があります。

変換で文字数・結果が変わる例
// ドイツ語のエスツェット: 大文字化で2文字になる
console.log("ß".toUpperCase());        // "SS"(1文字 → 2文字)

// トルコ語の i: ロケールで結果が変わる
console.log("I".toLowerCase());             // "i"
console.log("I".toLocaleLowerCase("tr"));   // "ı"(トルコ語ロケール)
ロケール依存に注意:厳密に各言語の規則で大文字・小文字化したい場合はtoLocaleUpperCase() / toLocaleLowerCase() を使います。また ß のように変換で文字数が変わる文字があるため、「変換結果の長さ」を前提にした処理には注意が必要です。

判定方法の比較

方法 ASCII A-Z 全角A アクセントÉ 用途
toUpperCase方式 幅広い文字を判定
正規表現 /[A-Z]/ × × ASCIIのみ厳密に
charCodeAt 範囲 × × ASCIIのみ・高速
使い分け:「英字(全角や各国語含む)かどうか」を広く見るなら toUpperCase 方式、「半角英字 A〜Z だけ」を厳密に見るなら正規表現 /[A-Z]/ が確実です。

よくある質問(FAQ)

Q文字が大文字かどうかを判定する一番確実な方法は?
Achar === char.toUpperCase() && char !== char.toLowerCase() です。2つ目の条件で数字・記号(大小の区別がない文字)を除外できます。半角A〜Zだけに限定したい場合は /[A-Z]/.test(char) を使います。
Q数字や記号を「大文字」と誤判定しないようにするには?
Achar !== char.toLowerCase() のガードを必ず付けます。これが無いと "1" === "1".toUpperCase()true になり数字が大文字扱いになります。このガードでアルファベット(大小の区別がある文字)だけに絞れます。
Q文字列が全部大文字かどうかを判定するには?
Astr === str.toUpperCase() && str !== str.toLowerCase() で判定できます。小文字が1つも無く、かつアルファベットを含む(数字だけではない)場合に true になります。
Q正規表現 /[A-Z]/ と toUpperCase方式はどちらを使うべき?
A半角A〜Zだけを厳密に判定するなら正規表現が確実です。一方 toUpperCase 方式は全角Aやアクセント付きAも「大文字」と判定するため、幅広い文字を扱う場合に向いています。目的に合わせて選びましょう。

まとめ

JavaScriptで大文字・小文字を判定する方法のポイントを整理します。

  • 1文字判定は char === char.toUpperCase() && char !== char.toLowerCase()(全角・アクセントも対応)
  • 2つ目のガードで数字・記号を除外(これが無いと誤判定)
  • 半角A〜Zだけを厳密に見るなら /[A-Z]/charCodeAt の範囲(65-90 / 97-122)
  • 文字列レベルは str === str.toUpperCase() && str !== str.toLowerCase()[...str].some/filter
  • ßSS・トルコ語の i など、Unicodeの変換エッジに注意(必要なら toLocale系

関連として、大文字・小文字を変換する方法全角を半角に変換する方法大文字ごとにスペースを入れる方法もあわせて確認すると、文字種の扱いに強くなれます。