Вопрос по javascript – Определение, является ли символ буквой

3

Учитывая набор слов, мне нужно поместить их в хеш-ключ с первой буквой слова. У меня есть слова = {}, с ключами A..Z и 0 для цифр и символов. Я делал что-то вроде

var firstLetter = name.charAt(0);
    firstLetter = firstLetter.toUpperCase();

if (firstLetter < "A" || firstLetter > "Z") {
    firstLetter = "0";
}
if (words[firstLetter] === undefined) {
    words[firstLetter] = [];
} 
words[firstLetter].push(name);

но это не помогает с диерезисом и другими символами, как в словеÄrzteversorgung. That word is put in the "0" array, how could I put it in the "A" array?

Проверьте этот пост / Stackoverflow.com вопросы / 863800 / ... Heitor Chang
Вы хотите, чтобы символы, подобные Ä, распознавались как буквы, или вы хотите, чтобы Ä определялись, как если бы это были буквы A? Bergi
Вы должны указать Ä и другие алфавиты этого символа. как вы делаете для 0 1 2 3 ..... и ABC и т. д. Rizstien
Ä - это не А. Вам понадобится сопоставление символов с ударениями без акцентов. Starkey
Использовать тест на регулярные выражения, как/[\w\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/.test(firstLetter) подойдет? Chris Carew

Ваш Ответ

4   ответа
4

JavaScript не считает международные символы «символами слова». Но вы можете сделать это с помощью регулярного выражения ниже:

var firstLetter = name.charAt(0);
firstLetter = firstLetter.toUpperCase();
if (!firstLetter.match(/^\wÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð$/)) {
    firstLetter = "0";
}
if (words[firstLetter] === undefined) {
    words[firstLetter] = [];
} 
words[firstLetter].push(name);
15

чтобы проверить, является ли символвероятнее всег письмо

var firstLetter = name.charAt(0).toUpperCase();
if( firstLetter.toLowerCase() != firstLetter) {
    // it's a letter
}
else {
    // it's a symbol
}

Это работает, потому что в JavaScript уже есть сопоставление строчных и прописных букв (и наоборот), поэтому, если символ не изменяетсяtoLowerCase() тогда его нет в таблице букв.

Интересный трюк, но, как вы подчеркиваете, он работает просто «вероятно». Но это может быть использовано, если вы добавите специальные проверки для всех символов, которые могут появиться и которые приводят к неверному результату в простом тесте. В диапазоне латинского 1 неверно классифицированы следующие символы: º и ª (мужские и женские порядковые индикаторы), резкий ß (вероятно, наиболее значимый здесь символ) и, к сожалению, микро знак µ (формально буква в Unicode, совместимость эквивалентна Греческая буква мю, но широко понимаемая как специальный символ, а не буква). Jukka K. Korpela
Он работает только для символов в двухпалатных сценариях, то есть для написания систем, которые различают прописные и строчные буквы; большинство сценариев этого не делают (например, иврит, деванагари, китайский). Jukka K. Korpela
@ JukkaK.Korpela - Да, есть минусы, а плюсы - скорость проверки. это может быть обработано намного быстрее, чем что-либо еще, и английский язык, вероятно, (должен) быть единственным языком, который нужен большинству людей) vsync
@ vsync, в вопросе упоминается слово «Ärzteversorgung». Это не английский. Обычно, если люди думают только об английском, они даже не задают этот вопрос - они просто предполагают, что[A-Za-z] закрывает все буквы. Jukka K. Korpela
Questions в Stackoverflow иногда ничего не значит, потому что я приехал сюда из Google, а то, о чем просил OP, не соответствует названию, поэтому важно охватить ответы для людей, которые приходят сюда из Google для ответов. vsync
3

есть ли разница. Только буквенные символы изменяются, когда они преобразуются в соответствующие прописные и строчные буквы (цифры, знаки пунктуации и т. Д. Не изменяются). Ниже приведен пример функции с учетом этой концепции:

function isALetter(charVal)
{
    if( charVal.toUpperCase() != charVal.toLowerCase() )
       return true;
    else
       return false;
}
не работает с ß, например Danubian Sailor
2

.charCodeAt(0); чтобы получить позицию в таблице ASCII, а затем сделать некоторые проверки.

Диапазон, который вы ищете, вероятно, составляет 65-90, 97-122, 128-154, 160-165 (включительно), но дважды проверьте это, просмотревASCII Chart

Что-то вроде этог

if((x>64&&x<91)||(x>96&&x<123)||(x>127&&x<155)||(x>159&&x<166))

Гдеx это код символа

Работает ли это с многобайтовыми символами UTF-8? jnrbsn
Я не знаю,charCodeAt MDN говорит «Кодовые точки Unicode находятся в диапазоне от 0 до 1 114 111» ajax333221
@ jnrbsn Нет, не будет ... ASCII не охватывает все, что считается буквой на каждом языке Jérôme Verstrynge
@ ajax333221 Есть несколько допустимых кодовых точек, которые не являются печатными символами Jérôme Verstrynge

Похожие вопросы