如何使用JavaScript测试字符串中的字母是大写还是小写?

469

我如何使用JavaScript测试字符串中的字母是大写还是小写?


3
我可以澄清一下问题吗 - 你想测试字符串中的特定字母是大写还是小写,还是想测试整个字符串是否包含任何大写或小写字母。如果是后者,那么你打算如何在不逐个测试每个字母的情况下得出结果? - Josh
3
这里提供了一些思路,你可以测试它们的速度。访问http://jsperf.com/isupper-comparison/5可以进行测试。 - odinho - Velmont
2
Idea #4 ([:upper:])非常快且非常酷,但它不起作用,请参见下面的我的评论和我更正后的http://jsperf.com/isupper-comparison/7。 - Antony Hatchkins
9
str == str.toUpperCase(); 返回 truefalse - Jacksonkr
2
如果你真的不想使用正则表达式,那么可以这样写:str.toUpperCase() === str && str.toLowerCase() !== str - Alireza Mirian
32个回答

493
josh和maleki的答案将在字符或整个字符串为数字时返回true,无论大小写如何。这会导致结果是错误的。 使用josh的示例:
var character = '5';
if (character == character.toUpperCase()) {
 alert ('upper case true');
}
if (character == character.toLowerCase()){
 alert ('lower case true');
}

另一种方法是先测试它是否为数字,否则测试其是否为大写或小写 例子

var strings = 'this iS a TeSt 523 Now!';
var i=0;
var character='';
while (i <= strings.length){
    character = strings.charAt(i);
    if (!isNaN(character * 1)){
        alert('character is numeric');
    }else{
        if (character == character.toUpperCase()) {
            alert ('upper case true');
        }
        if (character == character.toLowerCase()){
            alert ('lower case true');
        }
    }
    i++;
}

30
如果字符既不是数字也不是字母,比如标点符号,那么你是否仍会得到相同的错误结果? - LarsH
6
@LarsH 看这个:https://dev59.com/3XNA5IYBdhLWcg3wSrma#9728437 - ciembor
1
这段代码将会提示标点符号字符,例如 ! 是数字。 - Barmar
1
为什么不检查字符是否等于其自身的小写和大写字母,如果两者都为真,则返回假。 - user1663023
未捕获的语法错误:第4行出现意外的标记“;” while (i &lt;= strings.length){ 这一行有些无用的内容。 - giorgio79
显示剩余7条评论

92

其他答案存在的问题是,有些字符(如数字或标点符号)在检查大小写时也会返回true。

我发现这段代码非常有效,例如,现在"3"将返回false("3"默认为小写),但请考虑使用isNaN()过滤掉数字,并确保您实际上正在测试一个字符串。这里是代码:

function isLowerCase(str) {
    return str === str.toLowerCase() &&
           str !== str.toUpperCase();
}

这将适用于标点符号、数字和字母:
assert(isLowerCase("a"))
assert(!isLowerCase("Ü"))
assert(!isLowerCase("4"))
assert(!isLowerCase("_"))

要检查一个字母,只需使用isLowerCase(str[charIndex])进行调用。

7
不知道为什么其他回答会得到投票。我也只能想到这个解决方案——逻辑是“该字符是否有大写和小写变体?如果是,则返回它是大写还是小写”。 - aaaaaa
4
@GaurangTandon 你好,两年后我也注意到了这个问题,但之前没有发现,因为它被包裹在一个for循环中,并且向控制台记录了一些内容,总的来说不是一个可重用的代码片段,所以我和(根据此答案的投票)许多其他人自然而然地跳过了这个答案。因此,我认为将其作为快速复制粘贴答案与其他答案区分开来是有益的。 - WebFreak001
函数 isLowerCase(str) { 返回 str == str.toLowerCase() } - latitov
我不明白为什么你要检查!= upperCase,你实际上应该检查的是字符转换为小写后是否保持不变,而转换为大写的字符是否不同则与你无关,在我看来。如果你问我 '3' 是否是小写字母,我会说 '是',如果你问我 ';' 是否是小写字母,我也会说 '是'。但是你的函数在第二个 if 子句 '3'.toUpper != '3' 会失败 ==> false。 - E.Serra
@E.Serra 我认为 '3' 和 ';' 不是小写字母,因为它们没有大写变体。这也是其他常见 API 的工作方式。 (例如 Java 的 Character.isLowerCase)Unicode 还有字符类别,如大写字母和小写字母,其中不包括非字母字符。 - WebFreak001
显示剩余5条评论

87
if (character == character.toLowerCase())
{
  // The character is lowercase
}
else
{
  // The character is uppercase
}

70
const isUpperCase = (string) => /^[A-Z]*$/.test(string)

然后:

isUpperCase('A') // true
isUpperCase('a') // false

5
目前最佳答案,快速,不分配任何内存,也不转换数据。 - Martijn Scheffer
8
不过,无法处理带重音符号(á,Á),元音变异(öÖ,äÄ,üÜ)和字符(ß,ẞ)。 - NullDev
你确定这是 Go,而不是 JS 吗? - latitov
3
@latitov 你是什么意思?这是纯JavaScript。 - Shadow The Spring Wizard
@MartijnScheffer 我们实际上并不知道这个答案是否比转换为大写并进行比较更快,我们甚至不知道我们是否没有分配任何内存。几乎可以肯定的是,正则表达式将解析字符串并为正则表达式处理分配一堆节点。我认为创建正则表达式解析器的开销可能比转换为大写要大,特别是在一个字符的情况下(但当然没有测试我们就不知道)。 - prewett
当你转换大小写时,它会创建一个新的字符串,是的,我们知道内存何时被分配!正则表达式只会被创建一次,我怎么知道?我写过JS编译器,读了大部分Spidermoney和V8,坦白说,你的答案听起来有点随意,如果你了解JS引擎如何工作,就不需要测试,分配内存比进行一些数学运算昂贵得多,并且正则表达式经过高度优化。如果我真的需要最佳性能,我会使用一个表格(在JS中是一个Map)。 - Martijn Scheffer

50

如果字符为大写字母,它将记录true,并在其他情况下记录false:

var letters = ['a', 'b', 'c', 'A', 'B', 'C', '(', ')', '+', '-', '~', '*'];

​​​for (var ​i = 0; i<letters.length; i++) {
    if (letters[i] === letters[i].toUpperCase()
        && letters[i] !== letters[i].toLowerCase()) {
        console.log(letters[i] + ": " + true);
    } else {
        console.log(letters[i] + ": " + false);
    }
}​

你可以在这里进行测试:http://jsfiddle.net/Axfxz/(使用Firebug或其他工具)。

​​​for (var ​i = 0; i<letters.length; i++) {
    if (letters[i] !== letters[i].toUpperCase()
        && letters[i] === letters[i].toLowerCase()) {
        console.log(letters[i] + ": " + true);
    } else {
        console.log(letters[i] + ": " + false);
    }
}​

这是用于小写字母的:).


1
顺便提一下,它也可以处理带重音的字符,例如“É”,“Ñ”和“ñ”。 - Xavi
6
很遗憾,有些小写字母是没有相应的大写形式的(反之亦然)。德语中的 'ß' 是一个小写字母,但如果应用第二个函数,结果将会是错误的。请注意不要改变原文意思。 - jplatte
3
好的,请尝试这个:根据类别进行选择 - vovchisko

25
function isUpperCase(myString) { 
  return (myString == myString.toUpperCase()); 
} 
function isLowerCase(myString) { 
  return (myString == myString.toLowerCase()); 
} 

1
我相信这个解决方案只适用于字符串长度为一个字符且该字符是我们所关注的字符... 在调用这些方法之前,您需要先获取该字符。 - zaczap
5
@zaczap是错误的。它们将转换整个字符串(然后进行测试)。 - scunliffe
3
对评论点赞 +1 - 该回答稍微偏离了原问题,原问题询问字符串中的一个字母(而非整个字符串)。 - belugabob
3
让我们不要忘记严格的相等性检查! === FTW! - James
1
@所有人 - 正确的做法是只对整个字符串进行测试 - 您可以循环遍历字符串中的每个字母以测试每个字母。 - Josh
显示剩余3条评论

25

你可以使用正则表达式测试和 toUpperCase 方法:

String.prototype.charAtIsUpper = function (atpos){
      var chr = this.charAt(atpos);
      return /[A-Z]|[\u0080-\u024F]/.test(chr) && chr === chr.toUpperCase();
};
// usage (note: character position is zero based)
'hi There'.charAtIsUpper(3);      //=> true
'BLUE CURAÇAO'.charAtIsUpper(9);  //=> true
'Hello, World!'.charAtIsUpper(5); //=> false

另请参阅


2
@LarsH:我修改了(并简化了)原型方法。现在它包括变音符号。 - KooiInc
1
为什么要比较 && chr === chr.toUpperCase(); - Flame_Phoenix
3
@Flame_Phoenix 这个范围 \u0080-\u024F 可能包含小写的变音符号,所以测试应该同时检查字符本身。 - KooiInc

19
function isCapital(ch){
    return ch.charCodeAt() >= 65 && ch.charCodeAt() <= 90;
}

3
或者只需返回 (ch.charCodeAt() >= 65 && ch.charCodeAt() <= 90)。该语句判断字符的 ASCII 码是否在大写字母的范围内,如果是则返回 true,否则返回 false。 - Engineer

10

更具体地说,针对所要求的内容,传入一个字符串和要检查的位置。与Josh的方法非常接近,只不过这个方法将比较一个更大的字符串。本来想作为评论添加,但我还没有那个能力。

function isUpperCase(myString, pos) { 
    return (myString.charAt(pos) == myString.charAt(pos).toUpperCase()); 
}   

function isLowerCase(myString, pos) {
    return (myString.charAt(pos) == myString.charAt(pos).toLowerCase()); 
}

为最佳实践。 - РАВИ

9

给未来的我:/\p{Lu}/u 等同于 /\p{Uppercase_Letter}/u - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接