如何检查字符是否是Javascript中的字母?

Jér*_*nge 68 javascript string character letter

我在Javascript字符串中提取一个字符:

var first = str.charAt(0);
Run Code Online (Sandbox Code Playgroud)

我想检查一下是否是一封信.奇怪的是,Javascript中似乎不存在这样的功能.至少我找不到它.

我该怎么测试呢?

Jar*_*Par 111

我不相信有内置功能.但用正则表达式编写它很容易

function isLetter(str) {
  return str.length === 1 && str.match(/[a-z]/i);
}
Run Code Online (Sandbox Code Playgroud)

  • 该代码仅测试该字符是否是从a到z的基本字母之一(很少有语言只使用这些字母编写).这与提到的Java函数非常不同. (37认同)
  • 您仍然可以使用正则表达式,并根据需要添加更多详细信息:str.match(/ [AZ | az |ü|é] / i); //等等 (4认同)
  • 应该注意的是,实际上并没有返回true ||。正如人们所期望的那样是错误的。如果`str`是az中的值,则返回该值。否则,它返回null。如果您需要它返回true / false,请使用它。`isLetter:function(str){if(str.length!== 1 && str.match(/ [az] / i)){返回true; 返回false;},` (3认同)
  • Sooooooo 的结果没有返回 true 或 false 值,这就是我所关心的......这可以简单地通过更改 `return str.length === 1 && str.match(/[az]/ i);` 改为 `return str.length === 1 && !!str.match(/[az]/i);`。如果您想将其纳入您的答案中。尽管如此,还是投了赞成票。 (3认同)
  • @YiboYang - nope,去了上面的jsbin链接,把它改成了你的,然后运行了,得到了这个:"是'你'是一封信?真的""是'ü'是一个字母?假""是'à '是一封信?假"用你的代码. (2认同)

dal*_*ege 83

对于那些没有被更简单的检查所考虑的特殊字符/[a-zA-Z]/.test(c),利用ECMAScript case transformation(toUpperCase)可能是有益的.它将考虑一些外国字母表的非ASCII Unicode字符类.

function isLetter(c) {
  return c.toLowerCase() != c.toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案仅适用于大多数拉丁语,希腊语,亚美尼亚语和西里尔语脚本.它不适用于中文,日文,阿拉伯文,希伯来文和大多数其他文字.

  • 聪明.但基于我非常有限的理解,它不适用于没有大小写的字母,如中文或日文 (10认同)
  • 与基于`/ [az]/i`模式的解决方案相比,这个技巧将接受完整的拉丁字符范围.与包含完整拉丁语Unicode上下映射的其他解决方案相比,您可以节省99.2%的代码大小.将此解决方案称为"错误"是错误的,因为这取决于您的问题.如果您的范围是拉丁字符集,这是一种精简而优雅的解决方法. (4认同)
  • 很棒的代码 适用于所有基于拉丁语的字母。 (3认同)
  • 精彩解决方案 在c ='1a'的情况下,简单地将你的字符串拆分成数组并循环,例如,`function isLetters(arr){for(var i = 0; i <arr.length; i ++){if(arr [i]. toLowerCase()!= arr [i] .toUpperCase()){} else {return false; 返回true; } (3认同)
  • 我个人喜欢这样的函数,因为它比正则表达式函数更容易浏览和理解 (2认同)

Sum*_*mer 16

if( char.toUpperCase() != char.toLowerCase() ) 
Run Code Online (Sandbox Code Playgroud)

仅在字母的情况下返回true

  • 对于不区分大小写的脚本(例如中文),这会失败。 (3认同)
  • @Sumer,为什么会有帮助?仅仅因为代码点高于 127 并不意味着它是一个字母。 (3认同)
  • 有趣,为什么这项工作有效? (2认同)

bez*_*max 15

我相信这个插件具有您所寻求的功能:http://xregexp.com/plugins/(github链接:https: //github.com/slevithan/xregexp)

有了它,您可以简单地匹配所有的unicode字母\p{L}.

阅读此源文件的标题以查看它支持的类别:http://xregexp.com/plugins/xregexp-unicode-categories.js

  • @Peter 你能链接一个你认为适合 2019 年的答案吗?只要其他解决方案适用于所有 Unicode 字符,我就会添加一个链接作为对我的答案的编辑。 (9认同)

Mic*_*mid 14

ES6 支持 unicode-aware 正则表达式。

RegExp(/^\p{L}/,'u').test(str)
Run Code Online (Sandbox Code Playgroud)

这适用于所有字母。

不幸的是,Firefox 中存在一个错误(将在版本 78 中修复)阻止它被普遍使用。但是,如果您可以控制您的运行时环境并且它支持它(例如 Node.js),那么这是一个简单而全面的解决方案。

或者,XRegExp为所有浏览器提供了现代正则表达式的polyfill


fmg*_*fmg 7

How about using ASCII codes?

let n = str.charCodeAt(0);
let strStartsWithALetter = (n >= 65 && n < 91) || (n >= 97 && n < 123);
Run Code Online (Sandbox Code Playgroud)

  • 非常适合您仅处理英文文本的不太可能的情况。(这个假设对于几乎所有系统来说都是错误的。) (3认同)