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文字が大文字かどうかを判定する一番確実な方法は?
A
char === char.toUpperCase() && char !== char.toLowerCase() です。2つ目の条件で数字・記号(大小の区別がない文字)を除外できます。半角A〜Zだけに限定したい場合は /[A-Z]/.test(char) を使います。Q数字や記号を「大文字」と誤判定しないようにするには?
A
char !== char.toLowerCase() のガードを必ず付けます。これが無いと "1" === "1".toUpperCase() が true になり数字が大文字扱いになります。このガードでアルファベット(大小の区別がある文字)だけに絞れます。Q文字列が全部大文字かどうかを判定するには?
A
str === 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系)
関連として、大文字・小文字を変換する方法・全角を半角に変換する方法・大文字ごとにスペースを入れる方法もあわせて確認すると、文字種の扱いに強くなれます。
