Как проверить, является ли символ буквой в Javascript?

Я извлекаю символ из строки Javascript с помощью:

var first = str.charAt(0);

и я хотел бы проверить, является ли это письмом. Как ни странно, не похоже, что такая функциональность существует в Javascript. По крайней мере я не могу найти.

Как я могу проверить это?


person Jérôme Verstrynge    schedule 25.03.2012    source источник
comment
Создать номер и протестировать против NaN? Или просто isNan(first) я думаю.   -  person Marc    schedule 25.03.2012
comment
@Marc Если бы этот символ был, например, «-», ваш тест не указал бы, что это буква ...   -  person Jérôme Verstrynge    schedule 25.03.2012
comment
Определить букву? Только английская альфа или что-то другое? Вы хотите внести в черный или белый список?   -  person Wesley Murch    schedule 25.03.2012
comment
Хорошая точка зрения. Я ни в коем случае не эксперт по js.   -  person Marc    schedule 25.03.2012
comment
Насколько мне известно, @JVerstry - не является буквой.   -  person PeeHaa    schedule 25.03.2012
comment
Что-то вроде Java (если возможно): docs.oracle.com/javase/6/docs/api/java/lang/   -  person Jérôme Verstrynge    schedule 25.03.2012
comment
@JVerstry не все знают Java. Не могли бы вы просто сказать нам, какие символы будут разрешены?   -  person PeeHaa    schedule 25.03.2012
comment
@PeeHaa Верно, но в случае настоящего письма его тест вернет ложь, точно так же, как если бы это было «-». Таким образом, информация, предоставленная его тестом, все еще будет неполной.   -  person Jérôme Verstrynge    schedule 25.03.2012
comment
@PeeHaa Хорошо, символ, определенный в Юникоде.   -  person Jérôme Verstrynge    schedule 25.03.2012
comment
дубликат? stackoverflow.com/questions/10707972 /   -  person Adrien Be    schedule 15.09.2014
comment
вы можете удалить акценты, а затем выполнить простую проверку [a-z]. см. stackoverflow.com/questions/990904/   -  person Adrien Be    schedule 15.09.2014
comment
@JVerstry Я добавил свой ответ: он касается проблемы специальных символов (используемых в испанском, немецком, французском, итальянском и многих других языках)   -  person Adrien Be    schedule 15.09.2014
comment
Это отличный способ проверить, является ли символ числом или нет, но не обязательно буквой (из-за Unicode и т. д.). Если все, что вам нужно, это проверить числовую цифру, это должно сработать. Хотя в особых случаях могут быть полезны некоторые проверки символов, которые могут быть допустимыми числами, такими как NaN, INF, -INF, 1.0E+2 и т. д. Я действительно удивлен - это не считается числом в JS, поскольку язык такой свободный. Например, его можно интерпретировать как -0 или 0, подобно тому, как пустую строку можно сравнить с 0.   -  person Beejor    schedule 11.05.2015
comment
Я вижу, что многие люди называют здесь JS Java. JS и Java — это не одно и то же, даже близко. Один по сути игрушка, другой для создания сайтов.   -  person Ian Wise    schedule 10.01.2018
comment
Пожалуйста, если вы читаете (или пишете) ответы на этот вопрос, учтите, что за пределами «a-z» есть целый мир: диакритические знаки, лигатуры, нелатинское письмо. Предположение, что ваш код будет иметь дело только с (подмножеством) английских символов, является плохой практикой и прокладывает путь для неработающего программного обеспечения в долгосрочной перспективе. Обратите внимание, что даже в английском языке вы можете встретить «é», «ë», «æ», «&», «ffi» и т. д.   -  person Philippe-André Lorin    schedule 04.09.2020


Ответы (14)


Я считаю, что этот плагин обладает теми возможностями, которые вам нужны: http://xregexp.com/plugins/ (ссылка на github: https://github.com/slevithan/xregexp)

С его помощью вы можете просто сопоставить все буквы Юникода с \p{L}.

Прочтите заголовок исходного файла, чтобы узнать, какие категории он поддерживает: http://xregexp.com/plugins/xregexp-unicode-categories.js

person bezmax    schedule 25.03.2012
comment
Есть ли у вас опыт использования этого плагина в проектах, над которыми вы работали? (просто интересно, насколько надежна эта библиотека) - person Adrien Be; 17.09.2014
comment
голосование против, так как это, безусловно, плохой ответ на 2019 год - person Peter; 04.12.2019
comment
@Peter Не могли бы вы дать ссылку на ответ, который вы считаете подходящим для 2019 года? Я бы добавил ссылку на него в качестве редактирования своего ответа, если другое решение работает со всеми символами Unicode. - person bezmax; 05.12.2019

Я не верю, что для этого есть встроенная функция. Но достаточно просто написать с помощью регулярного выражения

function isLetter(str) {
  return str.length === 1 && str.match(/[a-z]/i);
}
person JaredPar    schedule 25.03.2012
comment
Код только проверяет, является ли символ одной из основных букв от a до z (очень немногие языки написаны с использованием только этих букв). Это сильно отличается от упомянутой функции Java. - person Jukka K. Korpela; 25.03.2012
comment
Вы по-прежнему можете использовать регулярное выражение и просто добавлять больше деталей по мере необходимости: str.match(/[A-Z|a-z|ü|é]/i); //так далее - person Eli; 23.06.2015
comment
может это работает? var char=str.toLowerCase(); return (char.length==1 && char>='a' && char<='z') - person Yibo Yang; 05.02.2016
comment
@YiboYang - нет, перешел по ссылке jsbin выше, изменил ее на вашу и запустил, и получил это: "u" - это буква? правда ли "ю" это буква? false 'а' это буква? false С вашим кодом. - person Julix; 05.09.2016
comment
Следует отметить, что на самом деле это не возвращает true || ложно, как и следовало ожидать. Если str является значением от az, возвращается это значение. В противном случае он возвращает ноль. Если вам нужно вернуть true/false, используйте это. isLetter: function (str) { if (str.length !== 1 && str.match(/[a-z]/i)) { return true; } return false; }, - person Regis; 20.01.2018
comment
Просто отрефакторил его, чтобы он возвращал true или false: function isLetter(str) { return (/^[a-z]{1}$/i).test(str); } - person Chen Dachao; 26.02.2020
comment
Это сработало для меня для простых случаев простой проверки алфавитов. Спасибо - person cherucole; 29.04.2020
comment
Оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооной.. чего можно добиться просто изменив return str.length === 1 && str.match(/[a-z]/i); на return str.length === 1 && !!str.match(/[a-z]/i);. Если это то, что вы хотели бы включить в свой ответ. Тем не менее проголосовал. - person ShanerM13; 09.09.2020

Что касается тех специальных символов, которые не учитываются при более простых проверках, таких как /[a-zA-Z]/.test(c), может быть полезно использовать преобразование регистра ECMAScript (toUpperCase). Он будет учитывать классы символов Unicode, отличные от ASCII, некоторых иностранных алфавитов.

function isLetter(c) {
  return c.toLowerCase() != c.toUpperCase();
}

ПРИМЕЧАНИЕ: это решение будет работать только для большинства латинских, греческих, армянских и кириллических шрифтов. Он НЕ будет работать для китайского, японского, арабского, иврита и большинства других шрифтов.

person filip    schedule 14.09.2015
comment
Умная. Но, исходя из моего очень ограниченного понимания, он не работает с алфавитами, в которых нет прописных и строчных букв, например, с китайским или японским. - person Notre; 18.02.2016
comment
отличный (и умный) код. Работает со всеми алфавитами на основе латиницы. - person fvlinden; 09.04.2016
comment
Лично я люблю такие функции, так как их гораздо проще посмотреть и понять, чем функции регулярных выражений. - person Djave; 17.05.2016
comment
гениальное решение. В случае c = '1a' просто разделите вашу строку на массив и выполните цикл, например, ` function isLetters(arr) { for (var i = 0; i ‹ arr.length; i++) { if(arr[i]. toLowerCase() != arr[i].toUpperCase()){ } else { return false; } } вернуть истину; } ` - person Ronnie Royston; 21.08.2016
comment
'у' это буква? правда ли "ю" это буква? правда ли "а" это буква? правда вроде работает! :) - person Julix; 05.09.2016
comment
Умно, но неправильно. :) Из часто задаваемых вопросов о сопоставлении регистра и имен в Unicode: нижний регистр? A: Нет (...) Подавляющее большинство скриптов не различаются по регистру. - person mik01aj; 06.03.2017
comment
По сравнению с решением, основанным на шаблоне /[a-z]/i, этот трюк будет принимать весь диапазон латинских символов. По сравнению с другим решением, содержащим полное сопоставление между верхним и нижним значениями Latin Unicode, вы экономите 99,2 % размера кода. Было бы ошибкой называть это решение неправильным, потому что оно зависит от вашей проблемы. Если вашей областью действия является набор латинских символов, это простой и элегантный способ решить эту проблему. - person filip; 08.03.2017
comment
@ToniMichelCaubet образцы, которые вы дали, c = '1a' или 'a1' не являются отдельными буквами! Этот алгоритм строго для одиночных символов. - person revelt; 24.08.2018
comment
Это работает для китайского и японского языков, так как они не используют буквы. - person Philippe-André Lorin; 04.09.2020
comment
Элегантное решение. - person Gabe; 03.03.2021

if( char.toUpperCase() != char.toLowerCase() ) 

Вернет true только в случае письма

Как указано в комментарии ниже, если ваш символ не является английским, High Ascii или двухбайтовым диапазоном, вам необходимо добавить проверку кодовой точки.

if( char.toUpperCase() != char.toLowerCase() || char.codePointAt(0) > 127 )
person Sumer    schedule 14.08.2018
comment
просто чтобы добавить два пенса, если вы превращаете его в функцию, добавьте проверку, является ли это строкой, и убедитесь, что длина равна единице, или убедитесь, что длина равна единице. Например, чтобы предотвратить 1a. - person revelt; 24.08.2018
comment
@AnchovyLegend Это работает, потому что нет прописных и строчных версий цифр, знаков препинания и других неалфавитных символов. Другими словами, прописные и строчные буквы будут одинаковыми, тогда как прописные и строчные буквы будут различаться. Лично мне нравится эта техника, потому что она не зависит от языка (работает с языками с диакритическими знаками). Я не запускал никаких тестов, но я думаю, что это более эффективно, чем создание регулярного выражения. (Но я могу ошибаться, так как регулярные выражения удивительно быстры.) - person Daniel 'Dang' Griffith; 03.02.2020
comment
Это не работает для скриптов, которые не различают верхний и нижний регистр, например китайский. - person Michael Schmid; 27.05.2020
comment
@MichaelSchmid, мы можем добавить проверку кодовой точки, скажем, a.codePointAt(0).toString(16). Кодовая точка должна быть больше 127. - person Sumer; 23.06.2020
comment
@Sumer, почему это поможет? То, что кодовая точка выше 127, не означает, что это буква. - person Michael Schmid; 23.06.2020
comment
Все символы разбросаны по кодовой точке до 128, остальные символы. Для этого можно использовать некоторую логику. - person Sumer; 24.06.2020
comment
@Sumer, Unicode в настоящее время имеет 248 966 назначенных кодовых точек. Только 100 520 из них являются буквами. - person Michael Schmid; 13.08.2020
comment
@michael, можете ли вы привести один пример, одну кодовую точку Unicode, которая не является буквой? - person Sumer; 14.08.2020
comment
@ Sumer, «¡» (перевернутый восклицательный знак, кодовая точка 161). Это знак препинания, используемый в испанском языке. - person Michael Schmid; 14.08.2020
comment
Полностью согласен @michael, есть ли решение для выделения таких символов? Я предполагаю, что в этом случае текущее решение будет работать для английского и других языков, где все символы имеют соответствующие заглавные буквы. - person Sumer; 17.08.2020
comment
@MichaelSchmid Китайские иероглифы не являются буквами, поэтому возвращать для них значение false правильно. - person Philippe-André Lorin; 04.09.2020
comment
Этот метод не работает с маленькими заглавными буквами (например, «ᴀ»). - person Philippe-André Lorin; 04.09.2020
comment
Этот метод не подходит для любого однопалатного шрифта, такого как иврит или арабский (например, «ل»). См. en.wikipedia.org/wiki/Unicase. - person Philippe-André Lorin; 04.09.2020

ES6 поддерживает регулярные выражения с поддержкой Unicode.

RegExp(/^\p{L}/,'u').test(str)

Это работает для всех алфавитов.

К сожалению, в Firefox есть ошибка (будет исправлена ​​в версии 78), которая препятствует тому, чтобы это использовалось повсеместно. Но если вы можете контролировать свою среду выполнения и она ее поддерживает (например, Node.js), это простое комплексное решение.

Кроме того, XRegExp предоставляет полифилл современных регулярных выражений для всех браузеров.

person Michael Schmid    schedule 26.05.2020

Как насчет использования кодов ASCII?

let n = str.charCodeAt(0);
let strStartsWithALetter = (n >= 65 && n < 91) || (n >= 97 && n < 123);
person fmg    schedule 25.06.2019
comment
Отлично работает для маловероятного случая, когда вы обрабатываете только английские тексты. (Предположение, неверное почти для каждой системы.) - person Michael Schmid; 14.08.2020
comment
Когда символы легко читаются (как в данном случае), написание кодов Ascii или Unicode (например, 65 вместо «A») является плохой практикой, потому что это нечитаемо. См. другие ответы о том, как написать это правильно. - person Philippe-André Lorin; 04.09.2020

Это решение работает и с специальными символами, например, é, è, ê, ü, ö, à

2 шага:

  1. Удалите акценты на основе этого ответа: Удалить акценты/диакритические знаки в строке в JavaScript
  2. Проверьте, является ли символ от a до z, используя регулярное выражение или юникод (на ваш выбор)

Прямые демонстрации моего решения:

  1. с использованием глобальных функций
  2. с использованием шаблона модуля JavaScript

Примечание. Я опубликовал решение, в котором используются глобальные функции, так как оно, вероятно, наиболее простое для понимания. Но обратите внимание на "шаблон модуля javascript", если вам нужен более качественный код (более чистый, простой в обслуживании и расширении), см. impressivewebs.com/my-current-javascript-design-pattern, а также это видео на YouTube (презентация Пола Айриша).

var defaultDiacriticsRemovalap = [
    {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
    {'base':'AA','letters':'\uA732'},
    {'base':'AE','letters':'\u00C6\u01FC\u01E2'},
    {'base':'AO','letters':'\uA734'},
    {'base':'AU','letters':'\uA736'},
    {'base':'AV','letters':'\uA738\uA73A'},
    {'base':'AY','letters':'\uA73C'},
    {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
    {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
    {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
    {'base':'DZ','letters':'\u01F1\u01C4'},
    {'base':'Dz','letters':'\u01F2\u01C5'},
    {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
    {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
    {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
    {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
    {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
    {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
    {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
    {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
    {'base':'LJ','letters':'\u01C7'},
    {'base':'Lj','letters':'\u01C8'},
    {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
    {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
    {'base':'NJ','letters':'\u01CA'},
    {'base':'Nj','letters':'\u01CB'},
    {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
    {'base':'OI','letters':'\u01A2'},
    {'base':'OO','letters':'\uA74E'},
    {'base':'OU','letters':'\u0222'},
    {'base':'OE','letters':'\u008C\u0152'},
    {'base':'oe','letters':'\u009C\u0153'},
    {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
    {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
    {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
    {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
    {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
    {'base':'TZ','letters':'\uA728'},
    {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
    {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
    {'base':'VY','letters':'\uA760'},
    {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
    {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
    {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
    {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
    {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
    {'base':'aa','letters':'\uA733'},
    {'base':'ae','letters':'\u00E6\u01FD\u01E3'},
    {'base':'ao','letters':'\uA735'},
    {'base':'au','letters':'\uA737'},
    {'base':'av','letters':'\uA739\uA73B'},
    {'base':'ay','letters':'\uA73D'},
    {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
    {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
    {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
    {'base':'dz','letters':'\u01F3\u01C6'},
    {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
    {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
    {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
    {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
    {'base':'hv','letters':'\u0195'},
    {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
    {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
    {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
    {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
    {'base':'lj','letters':'\u01C9'},
    {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
    {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
    {'base':'nj','letters':'\u01CC'},
    {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
    {'base':'oi','letters':'\u01A3'},
    {'base':'ou','letters':'\u0223'},
    {'base':'oo','letters':'\uA74F'},
    {'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
    {'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
    {'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
    {'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
    {'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
    {'base':'tz','letters':'\uA729'},
    {'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
    {'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
    {'base':'vy','letters':'\uA761'},
    {'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
    {'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
    {'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
    {'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
];

var diacriticsMap = {};
for (var i=0; i < defaultDiacriticsRemovalap.length; i++){
    var letters = defaultDiacriticsRemovalap[i].letters.split("");
    for (var j=0; j < letters.length ; j++){
        diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
    }
}

function removeDiacriticFromChar (char) {
    return diacriticsMap[char] || char; 
}


/*
 *  [1] Remove the accent, based on answer of https://stackoverflow.com/questions/990904/javascript-remove-accents-in-strings
 *  [2] Check if a to z character, using regex or unicode (your choice, here using regex)
 *
 */
function isLetter(char) {
  var charWithoutAccent = removeDiacriticFromChar(char);  /* [1] */
  return charWithoutAccent.match(/[a-z]/i);               /* [2] */
}

console.log( "is 'u' is a letter? " + (isLetter('u') ? 'true' : 'false') );
console.log( "is 'ü' is a letter? " + (isLetter('ü') ? 'true' : 'false') );
console.log( "is 'à' is a letter? " + (isLetter('à') ? 'true' : 'false') );
console.log( "is 'ö' is a letter? " + (isLetter('ö') ? 'true' : 'false') );
console.log( "is 'ù' is a letter? " + (isLetter('ù') ? 'true' : 'false') );
console.log( "is 'é' is a letter? " + (isLetter('é') ? 'true' : 'false') );
console.log( "is 'é' is a letter? " + (isLetter('é') ? 'true' : 'false') );
console.log( "is 'ê' is a letter? " + (isLetter('ê') ? 'true' : 'false') );

person Adrien Be    schedule 15.09.2014
comment
Похоже, он не работает с китайскими или японскими иероглифами. - person Notre; 18.02.2016
comment
это как сказать что небо голубое - person Adrien Be; 18.02.2016

Таким образом, мы получили первый символ, используя функцию charArt(), затем попытайтесь сопоставить его с помощью регулярного выражения, чтобы проверить, есть ли буква в нижнем регистре, начинающаяся с a до z, и вернуть его результаты как boolean

Boolean('#Foo'.charAt(0).match(/[a-zA-Z]/)) // false
Boolean('Foo'.charAt(0).match(/[a-zA-Z]/)) // true
person FDisk    schedule 22.05.2020
comment
Не могли бы вы дать краткое объяснение или описание Кодекса? Кодовые ответы не приветствуются. - person Nimantha; 22.05.2020
comment
Письмо не просто от а до я. Английский - довольно важный язык, да, и даже английский не ТОЛЬКО использует от a до z. - person Gábor; 11.01.2021

Пишу сюда, потому что не хочу задавать новый вопрос. Предполагая, что в коде нет объявлений отдельных символов, вы можете eval() символа вызвать ошибку и проверить тип символа. Что-то типа:

function testForLetter(character) {
  try {
    //Variable declarations can't start with digits or operators
    //If no error is thrown check for dollar or underscore. Those are the only nonletter characters that are allowed as identifiers
    eval("let " + character + ";");
    let regExSpecial = /[^\$_]/;
    return regExSpecial.test(character);
  } catch (error) {
    return false;
  }
}

console.log(testForLetter("!")); //returns false;
console.log(testForLetter("5")); //returns false;
console.log(testForLetter("ن")); //returns true;
console.log(testForLetter("_")); //returns false;

person Didakov    schedule 30.07.2018
comment
Если ваш тест возвращает true для символов подчеркивания, то он бесполезен. - person Jérôme Verstrynge; 30.07.2018
comment
Это создает потенциальную угрозу безопасности внедрения кода. Используйте только с осторожностью, если вообще. - person Michael Schmid; 13.08.2020

Можно узнать, является ли символ буквой или нет, используя стандартную встроенную функцию isNaN или Number.isNaN() из ES6:

isNaN('s') // true
isNaN('-') // true
isNaN('32') // false, '32' is converted to the number 32 which is not NaN

Он возвращает true, если заданное значение не является числом, иначе false.

person Alexa-905    schedule 01.05.2020
comment
Умно, но я не уверен, что это достаточный ответ... Кроме того, Марк предложил это в комментариях... - person Garrett Motzner; 01.05.2020
comment
var sn = строка indijf &; var nn = isNaN(sn) document.getElementById(demo).innerHTML = nn; Я передаю числа или специальные символы по-прежнему возвращают true. не могли бы вы добавить более подробные ответы - person Mr S Coder; 18.05.2020
comment
В каком алфавите буква «-»? - person Michael Schmid; 14.08.2020

Другой вариант — использовать библиотеку unicode-properties. Библиотека поддерживает Unicode версии 12. В этом примере библиотека возвращает категорию символов для данная строка. А затем проверяет, равен ли первый символ категории «L» (что, очевидно, означает букву).

var unicode = require("unicode-properties");
let str = "E";
console.log(unicode.getCategory(str.charCodeAt(0)).charAt(0) === "L"); // True

person HawVie    schedule 05.04.2021

Я сделал функцию для этого:

var isLetter = function (character) {
  if( (character.charCodeAt() >= 65 && character.charCodeAt() <= 90) || (character.charCodeAt() >= 97 && character.charCodeAt() <= 122) ) {
    return true;
  }
  else{
    return false;
  }
}

Это в основном проверяет в таблице ASCII, относится ли код символа к букве.

Вы можете посмотреть таблицу ASCII по этой ссылке и сравнить столбцы DEC (где код) и символ: https://www.ascii-code.com/

Примечание. Моя функция верна только для «простых» букв (например, «Á», «é», «ç», «Ü» она вернет false... но если вам нужно, вы можете адаптировать эту функцию к другим условиям. ).

person PedroProgrammer    schedule 05.04.2020

Мы можем проверить также простым способом:

function isLetter(char){
    return ( (char >= 'A' &&  char <= 'Z') ||
             (char >= 'a' &&  char <= 'z') );
}


console.log(isLetter("a"));
console.log(isLetter(3));
console.log(isLetter("H"));

person ganesh phirke    schedule 04.06.2020

person    schedule
comment
В настоящее время Unicode содержит 128 000 символов, охватывающих 135 алфавитов. Эти 26 — очень маленькое их подмножество. - person Michael Schmid; 27.05.2020