Есть ли простой способ преобразовать строку в регистр заголовка? Например. john smith становится John Smith. Я не ищу чего-то сложного вроде Решение Джона Ресига, просто (надеюсь) какой-то одно- или двухстрочный.
@theAnubhav да у нас есть эталон сейчас



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


var toMatch = "john w. smith";
var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
return i.toUpperCase() + (r != null ? r : "");
}
)
Вроде работает ... Протестировано с указанным выше: «Быстро-коричневый, лисица? / Прыгает / ^ через ^ ¡ленивую! Собаку ...» и «C: / программные файлы / какой-то поставщик / их 2-е приложение / файл1.txt».
Если вы хотите 2Nd вместо 2nd, вы можете перейти на /([a-z])(\w*)/g.
Первую форму можно упростить как:
function toTitleCase(toTransform) {
return toTransform.replace(/\b([a-z])/g, function (_, initial) {
return initial.toUpperCase();
});
}
Попробуй это:
function toTitleCase(str) {
return str.replace(
/\w\S*/g,
function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}
);
}<form>
Input:
<br /><textarea name = "input" onchange = "form.output.value=toTitleCase(this.value)" onkeyup = "form.output.value=toTitleCase(this.value)"></textarea>
<br />Output:
<br /><textarea name = "output" readonly onclick = "select(this)"></textarea>
</form>Может ли кто-нибудь объяснить, почему используется \w\S*, например, вместо \w+ или \w*? Я не знаю, почему вы хотите включать что-либо, кроме пробелов, и поэтому изменить Джим-Боб на Джим-боб.
@martinCzerwi \w\S* также вызвал проблему с Jim-bob на нашей стороне. Использование \w* решило эту проблему.
/([^\W_]+[^\s-]*) */g решает проблему Jim-Bob, то есть: jim-bob-->Jim-Bob
Спасибо за код Грег, что здесь означает комментарий Павла? Будет ли это несовместимо с Firefox или IE?
@PeteHerbertPenito Я предполагаю, что он протестировал его в Chrome 12 и обнаружил, что он работает только с набором символов Latin-1. например toTitleCase ("āšœ") -> "āšœ" (то же самое в Chrome 30)
Если вы желаете использовать jim-bob-->Jim-Bob, вам, вероятно, следует сделать /\b\w+/g. Пример: str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
Как насчет строк с '_', например. 'hot_wheels'. Как следует изменить регулярное выражение, чтобы справиться с этим?
Будь проще, \b\w
\w\S* используется вместо \w+ или \w*, поэтому такие слова, как Don't, не изменяются до Don'T, но, как указывали другие, \w\S* вызывает проблемы с переносом слов.
А как насчет таких имен, как Джон Макдональд и им подобных? Не следует ли оставить все после первой буквы нетронутым (не в нижнем регистре)?
Как и многие ответы здесь, это перерывы для входов с одним символом: toTitleCase('f')
Как и многие ответы здесь, это не работает для (1) языков, где регистр заголовка не влияет только на первую букву, и (2) скрипты с использованием дополнительных кодовых точек. То, что он работает для английского языка, не означает, что он работает в целом.
Добавление второго преобразования для исправления некоторых крайних случаев, например Hawke's Bay: str .replace(/\b\w+/g, match => { return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase(); }) .replace(/['’”‘“][A-Z]{1}\b/g, match => { return match.toLowercase(); });
/\b\w+('\w{1})?/g сохраняет Don't и Jim-Bob или Inside/Outside. Также опустите toLowerCase(), чтобы оставить McDonalds как есть.
Это терпит неудачу, когда "ØSTER HUS AS" дает "ØSter Hus As".
Почему некоторые разработчики настаивают на изменении регистра или удалении пробелов в именах людей? Это действительно обидно, когда какое-то приложение заставляет меня указывать неправильное имя. Я умею писать свое имя! В итоге я редактирую html или отключаю JS, чтобы моя фамилия не испортилась полностью.
Я сделал эту функцию, которая может обрабатывать фамилии (так что это не регистр заголовков), такие как «Макдональд» или «Макдональд», или «О'Тул», или «Д'Орацио». Однако он не обрабатывает немецкие или голландские имена с «van» или «von», которые часто пишутся в нижнем регистре ... Я считаю, что «de» также часто бывает в нижнем регистре, например, «Robert de Niro». Их еще предстоит решить.
function toProperCase(s)
{
return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
function(, , , , ) { if (){return .toUpperCase()++.toUpperCase();} return .toUpperCase(); });
}
+1 за узнаваемость имени. Однако он также не обрабатывает "macy" правильно.
Это была единственная функция, которая правильно обрабатывала преобразование верхнего и нижнего регистра в правильный регистр и заметила такие инициалы, как «Виргинские острова США».
Вы можете обойти проблему macy, поместив туда отрицательный прогноз, чтобы \b((m)(a?c))?(\w) стал \b((m)(a?c))?(\w)(?!\s).
Попробуйте применить стиль CSS текстовое преобразование к своим элементам управления.
например: (text-transform: capitalize);
-1. Этот CSS работает, но не работает так, как ожидает большинство людей, потому что, если текст начинается с заглавных букв, эффекта нет. webmasterworld.com/forum83/7506.htm
@Akshar: Правило нижнего регистра будет заменено правилом регистра заголовка. Поскольку css не изменяет исходный контент, в результате удаляется правило нижнего регистра (оставляя исходный контент только заглавными), а затем применяется правило titlecase (ничего не делая).
JS используется вне браузеров.
Вопрос был: "Есть ли простой способ преобразовать строку в регистр заголовка?". Этот ответ не преобразует строку. Это стиль, применяемый поверх струны.
Если вы хотите, чтобы данные в вашей базе данных были чистыми, чтобы их можно было аккуратно использовать при передаче сторонним службам или экспорту в CSV, то CSS на самом деле не вариант. CSS предназначен для косметики, и хотя с годами он значительно вырос, и вы можете использовать его для решения подобных проблем, решение остается косметическим и не решает основную проблему.
+1 Вопрос расплывчатый и не объясняет вариант использования. Возможно, они имели в виду преобразование строки с помощью JS, но на самом деле CSS для них работает лучше, как и мой случай.
В мусорное ведро, "JavaScript" буквально в вопросе.
Если вы собираетесь отображать текст в браузере, это лучшее решение, потому что он обрабатывает Unicode, который не рассматривается ни в одном из других ответов.
На всякий случай, если вас беспокоят эти слова-вставки, вы всегда можете просто указать функции, что не следует использовать с заглавной буквы.
/**
* @param String str The text to be converted to titleCase.
* @param Array glue the words to leave in lowercase.
*/
var titleCase = function(str, glue){
glue = (glue) ? glue : ['of', 'for', 'and'];
return str.replace(/(\w)(\w*)/g, function(_, i, r){
var j = i.toUpperCase() + (r != null ? r : "");
return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
});
};
Надеюсь, что это помогает вам.
Если вы хотите работать с ведущими связующими словами, вы можете отслеживать эту еще с одной переменной:
var titleCase = function(str, glue){
glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
var first = true;
return str.replace(/(\w)(\w*)/g, function(_, i, r) {
var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
first = false;
return result;
});
};
Вы можете разбить строку на массив. Таким образом, у нас могут быть португальские, испанские, итальянские и французские предлоги: glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');.
Это не гарантирует использование заглавных букв в первом слове; т.е. and another thing становится and Another Thing. Просто нужен элегантный способ всегда писать первое слово с большой буквы.
@BradKoch - заполните пробелами, чтобы вы использовали «and», «de» и т. д. В качестве поискового слова, тогда «And Another And Another» заменит на «And Another and Another».
хорошо, за исключением того, что он также использует заглавные буквы после 'и - например, H'Dy или Number-One
Вместо использования тернарного оператора вы можете просто использовать запасной вариант: glue = glue || ['из', 'для', 'и', 'а'];
@ tm2josep да, я писал так, как рекомендует Крокфорд, когда отвечал на этот вопрос :-) В тот день прошло 6 лет, но я все еще предпочитаю явное принуждение типов.
Чуть более элегантный способ адаптации функции Грега Дина:
String.prototype.toProperCase = function () {
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};
Назовите это так:
"pascal".toProperCase();
Имейте в виду, что если у вас есть пользователь с тире в имени и он вводит Jo-Ann Smith, этот код преобразует его в Jo-ann Smith (обратите внимание на a в нижнем регистре в Ann).
@daniellmb Почему бы ему не изменить прототип String? Думаю, это хорошее решение. Подумайте об открытых классах ruby, вполне допустимо добавлять функции к существующим классам, и это широко распространено.
@ marco-fiset Потому что это не нравится другим! Плохие вещи случаются, когда у вас есть две библиотеки, которые обе пытаются модифицировать собственные объекты JavaScript с несовместимыми изменениями. Представьте, если бы jQuery и Google Maps следовали этому шаблону проектирования, у вас не могло бы быть и того, и другого на одной странице.
@daniellmb Отличный момент. Предоставление префикса имени метода должно помочь избежать этого, так как это сделает метод неперечисляемым.
Мне кажется, что выражение «не изменять собственные объекты JavaScript» похоже на «никогда не использовать goto» или «eval - это зло». Есть много случаев, когда это нормально. Если вы полностью контролируете свой проект и, конечно, не планируете выпускать его как библиотеку, я не вижу проблем с этим методом.
Вот почему вы не расширяете собственные объекты: eslint.org/docs/rules/no-extend-native
По какой-то причине второе слово моих предложений не пишется с заглавной буквы
Как и многие ответы здесь, это перерывы для входов с одним символом: 'f'.toProperCase
Вот моя функция, которая преобразуется в регистр заголовка, но также сохраняет определенные аббревиатуры в верхнем регистре и второстепенные слова в нижнем регистре:
String.prototype.toTitleCase = function() {
var i, j, str, lowers, uppers;
str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
// Certain minor words should be left lowercase unless
// they are the first or last words in the string
lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At',
'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
for (i = 0, j = lowers.length; i < j; i++)
str = str.replace(new RegExp('\s' + lowers[i] + '\s', 'g'),
function(txt) {
return txt.toLowerCase();
});
// Certain words such as initialisms or acronyms should be left uppercase
uppers = ['Id', 'Tv'];
for (i = 0, j = uppers.length; i < j; i++)
str = str.replace(new RegExp('\b' + uppers[i] + '\b', 'g'),
uppers[i].toUpperCase());
return str;
}
Например:
"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"
Твой понравился, тоже сталкиваюсь с проблемами при работе с римскими числами ... только что пропатчил с помощью I, II, III, IV и т. д.
Слова, поставленные через дефис, должны быть написаны с заглавной буквы. С вашей функцией JIM-BOB не переходит к Jim-Bob, а вместо этого переходит к Jim-bob
Зафиксированный. Регулярное выражение в третьей строке было изменено с /\w\S*/g на /([^\W_]+[^\s-]*) */g в соответствии с приведенным выше комментарием @awashburn, чтобы решить эту проблему.
Есть ли преимущество, которое можно получить от использования вашего шаблона регулярного выражения по сравнению с /\b\w+/g, который я считаю более понятным?
Не то, чтобы я мог видеть, я просто принимал предложение другого комментатора решить проблему с переносом слов; но ваше регулярное выражение, похоже, работает так же хорошо, а простота всегда лучше. Для потомков и будущих посетителей этого поста, я просто изменил регулярное выражение в третьей строке с /([^\W_]+[^\s-]*) */g на /\b\w+/g согласно комментарию @ Michael; прокомментируйте, если вы обнаружите случай, когда необходимо более сложное регулярное выражение.
Я изменил регулярное выражение 3-й строки на /\b[\w-\']+/g, чтобы разрешить перенос слов и апостроф в словах.
Случай с апострофом, кажется, объясняет, почему /([^\W_]+[^\s-]*) */g был таким сложным; он также правильно обрабатывает фигурные кавычки, чего не делает /\b[\w-\']+/g, поэтому я вернусь к /([^\W_]+[^\s-]*) */g. Он также правильно обрабатывает слова, поставленные через дефис.
Превосходно. Это мне помогло. Измените регулярное выражение на /([^\W_ght+[^\s-\.pting*) * / g, чтобы преобразовать аббревиатуры с точкой в верхний регистр, например i.b.m. Были слова, содержащие '&', поэтому добавлено '& Amp;' понижает.
Чтобы напомнить нам, что язык запутан, существует фрейдистский идентификатор, который не прописан полностью. Если только вы не кричите, а это такая уж простая вещь.
Это не работает с таким названием, как «Revelation: The Seven Bowls», но в целом довольно неплохо.
Без использования регулярного выражения только для справки:
String.prototype.toProperCase = function() {
var words = this.split(' ');
var results = [];
for (var i = 0; i < words.length; i++) {
var letter = words[i].charAt(0).toUpperCase();
results.push(letter + words[i].slice(1));
}
return results.join(' ');
};
console.info(
'john smith'.toProperCase()
)Спасибо за решение без регулярных выражений!
Попробуй это
String.prototype.toProperCase = function(){
return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g,
function(){
return .toUpperCase();
}
);
};
Пример
var str = 'john smith';
str.toProperCase();
Так же полнофункционально, как решение Джона Ресига, но однострочно: (на основе этот проект github)
function toTitleCase(e){var t=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return e.replace(/([^\W_]+[^\s-]*) */g,function(e,n,r,i){return r>0&&r+n.length!==i.length&&n.search(t)>-1&&i.charAt(r-2)!= = ":"&&i.charAt(r-1).search(/[^\s-]/)<0?e.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?e:e.charAt(0).toUpperCase()+e.substr(1)})};
console.info( toTitleCase( "ignores mixed case words like iTunes, and allows AT&A and website.com/address etc..." ) );
jQuery тоже будет однострочным, если вы удалите все символы новой строки. ;)
Было бы хорошо, если бы это был четкий, хорошо отформатированный код, а не уменьшенный.
> однострочный> имеет точку с запятой
var result =
'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())
console.info(result) // This Is Very InterestingПросто вопрос, конструкция () предназначена для определения соответствия любой последовательности параметров: то есть (a | b) соответствует a или b. Что делает конструкция (.)?
Для всех, у кого был такой же вопрос, он определяет замену «blob», которая используется в разделе замены. Капли нумеруются последовательно, первый () помещается в $ 1, второй - в $ 2. Я нашел этот сайт полезным: javascript.info/tutorial/regular-expressions-methods
Я не могу заставить вышеуказанное работать, но я далек от мастера регулярных выражений. Я использую 'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;}). Опять же, это работает только для заглавной буквы в строке, но в случае, если это то, что вам нужно, моя конструкция работает.
По какой-то причине FF35, кажется, задыхается от ''.toUpperCase(), кажется, что прописные буквы не были выполнены к моменту присвоения значения. Обошелся с помощью функции 'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Всем привет, ответ исправлен! Я почти уверен, что к тому времени, когда я опубликовал его, он работал. В любом случае спасибо за вклад!
Вот моя версия, ИМО, она проста для понимания и элегантна.
var str = "foo bar baz"
console.info(
str.split(' ')
.map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
.join(' ')
)
// returns "Foo Bar Baz"В качестве альтернативы вы можете строчные буквы в отображении: str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
Я не согласен с тем, чтобы называть .toLowerCase(). В таких именах, как «Макдональдс» или в акронимах, таких как «как можно скорее», должны сохраняться заглавные буквы. Если кто-то действительно передал строку вроде «heLLO», приложение не должно предполагать, что прописные буквы неверны.
@ThomasHigginbotham Как насчет этого? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
Да, предпочтительнее предоставить возможность принудительно использовать строчные буквы.
Да, это легко понять, но когда я пробую это, на самом деле ничего не пишется с заглавной буквы (по какой-то причине).
Это сломается, если str - одиночный символ.
Это сломается, если str содержит последовательные пробелы
Похоже, это самое быстрое решение :)
Большинство этих ответов, похоже, игнорируют возможность использования метасимвола границы слова (\ b). Более короткая версия ответа Грега Дина с его использованием:
function toTitleCase(str)
{
return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
}
Также работает с именами через дефис, такими как Jim-Bob.
Это элегантное частичное решение, но оно не работает со строками с диакритическими знаками или прописными буквами. Я получаю "София Вергара" => "София Вергара" или "София ВЕРГАРА" => "София ВЕРГАРА". Второй случай может быть решен с помощью функции apply .toLowerCase () перед .replace (...). В первом случае нужно найти правильное регулярное выражение.
Хм, это похоже на ошибку в реализации регулярного выражения, я бы подумал, что акцентированные символы должны быть символами слова (хотя вы правы, как есть, это не работает для этих случаев).
Взяв решение "lewax00", я создал это простое решение, которое заставляет "w" начинаться с пробела или "w", которые запускают слово, но не может удалить лишние промежуточные пробелы.
"SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); });Результат - "София Вергара".
Это не коротко, но вот что я придумал на недавнем школьном задании:
var myPoem = 'What is a jQuery but a misunderstood object?'
//What is a jQuery but a misunderstood object? --> What Is A JQuery But A Misunderstood Object?
//code here
var capitalize = function(str) {
var strArr = str.split(' ');
var newArr = [];
for (var i = 0; i < strArr.length; i++) {
newArr.push(strArr[i].charAt(0).toUpperCase() + strArr[i].slice(1))
};
return newArr.join(' ')
}
var fixedPoem = capitalize(myPoem);
alert(fixedPoem);function toTitleCase(str) {
var strnew = "";
var i = 0;
for (i = 0; i < str.length; i++) {
if (i == 0) {
strnew = strnew + str[i].toUpperCase();
} else if (i != 0 && str[i - 1] == " ") {
strnew = strnew + str[i].toUpperCase();
} else {
strnew = strnew + str[i];
}
}
alert(strnew);
}
toTitleCase("hello world how are u");
Это однострочное решение, если вы хотите преобразовать каждую работу в строке, разделите строку на «», выполните итерацию по частям и примените это решение к каждой части, добавьте каждую преобразованную часть в массив и объедините ее с помощью «».
var stringToConvert = 'john';
stringToConvert = stringToConvert.charAt(0).toUpperCase() + Array.prototype.slice.call(stringToConvert, 1).join('');
console.info(stringToConvert);Прототип решения Грега Дина:
String.prototype.capitalize = function() {
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
Более простая, более производительная версия с простым кешированием.
var TITLE_CASE_LOWER_MAP = {
'a': 1, 'an': 1, 'and': 1, 'as': 1, 'at': 1, 'but': 1, 'by': 1, 'en':1, 'with': 1,
'for': 1, 'if': 1, 'in': 1, 'of': 1, 'on': 1, 'the': 1, 'to': 1, 'via': 1
};
// LEAK/CACHE TODO: evaluate using LRU.
var TITLE_CASE_CACHE = new Object();
toTitleCase: function (title) {
if (!title) return null;
var result = TITLE_CASE_CACHE[title];
if (result) {
return result;
}
result = "";
var split = title.toLowerCase().split(" ");
for (var i=0; i < split.length; i++) {
if (i > 0) {
result += " ";
}
var word = split[i];
if (i == 0 || TITLE_CASE_LOWER_MAP[word] != 1) {
word = word.substr(0,1).toUpperCase() + word.substr(1);
}
result += word;
}
TITLE_CASE_CACHE[title] = result;
return result;
},Это основано на моем решении для Костер FreeCodeCamp "Титульный случай", которое требует, чтобы вы сначала преобразовали данную строку во все строчные буквы, а затем преобразовали каждый символ, идущий через пробел, в верхний регистр.
Без использования регулярного выражения:
function titleCase(str) {
return str.toLowerCase().split(' ').map(function(val) { return val.replace(val[0], val[0].toUpperCase()); }).join(' ');
}
function titleCase(str) {
str = str.toLowerCase();
var strArray = str.split(" ");
for(var i = 0; i < strArray.length; i++){
strArray[i] = strArray[i].charAt(0).toUpperCase() + strArray[i].substr(1);
}
var result = strArray.join(" ");
//Return the string
return result;
}
String.prototype.capitalize = function() {
return this.toLowerCase().split(' ').map(capFirst).join(' ');
function capFirst(str) {
return str.length === 0 ? str : str[0].toUpperCase() + str.substr(1);
}
}
Использование:
"hello world".capitalize()
Прекрасно, кроме String.prototype. Не связывайтесь со встроенными объектами!
Если регулярное выражение, используемое в приведенных выше решениях, сбивает вас с толку, попробуйте этот код:
function titleCase(str) {
return str.split(' ').map(function(val){
return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
}).join(' ');
}
любить это! без преобразования в массивы.
эээ ... splitделает преобразует его в массив, вы просто не видите это так очевидно, потому что map означает, что вам не нужно использовать нотацию []
Это то же самое, что и Ответ a8m двумя годами ранее.
не совсем то же самое; это использует старый стиль function вместо синтаксиса нового стиля => для функции сопоставления
Разрывы для ввода с одним символом.
@AlexChaffee проверьте историю изменений. a8m не использовал стрелку в исходном ответе.
Моя простая и легкая версия проблемы:
function titlecase(str){
var arr=[];
var str1=str.split(' ');
for (var i = 0; i < str1.length; i++) {
var upper= str1[i].charAt(0).toUpperCase()+ str1[i].substr(1);
arr.push(upper);
};
return arr.join(' ');
}
titlecase('my name is suryatapa roy');
Используйте /\S+/g для поддержки диакритических знаков:
function toTitleCase(str) {
return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
}
console.info(toTitleCase("a city named örebro")); // A City Named ÖrebroОднако: «sunshine (yellow)» ⇒ «Sunshine (yellow)»
Просто еще одна версия, которую нужно добавить в смесь. Это также проверит, равна ли string.length 0:
String.prototype.toTitleCase = function() {
var str = this;
if (!str.length) {
return "";
}
str = str.split(" ");
for(var i = 0; i < str.length; i++) {
str[i] = str[i].charAt(0).toUpperCase() + (str[i].substr(1).length ? str[i].substr(1) : '');
}
return (str.length ? str.join(" ") : str);
};
Надежный способ функционального программирования для Title Case Function
Версия Exaplin
function toTitleCase(input){
let output = input
.split(' ') // 'HOw aRe YOU' => ['HOw' 'aRe' 'YOU']
.map((letter) => {
let firstLetter = letter[0].toUpperCase() // H , a , Y => H , A , Y
let restLetters = letter.substring(1).toLowerCase() // Ow, Re, OU => ow, re, ou
return firstLetter + restLetters // conbine together
})
.join(' ') //['How' 'Are' 'You'] => 'How Are You'
return output
}
Версия реализации
function toTitleCase(input){
return input
.split(' ')
.map(i => i[0].toUpperCase() + i.substring(1).toLowerCase())
.join(' ')
}
toTitleCase('HoW ARe yoU') // reuturn 'How Are You'
Почему не просто function toTitleCase(input){ return input.....join(' ') }
Вы можете сразу toLowerCase строку, а затем просто toUpperCase первую букву каждого слова. Становится очень простым 1 лайнер:
function titleCase(str) {
return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}
console.info(titleCase('iron man'));
console.info(titleCase('iNcrEdible hulK'));Мне нравится это решение; красиво и просто. Похоже, что в ваш ответ был добавлен фрагмент CoffeeScript (s => s.toUpperCase()). Мой вариант делать то, что вы сделали, но расширения объекта String (как спорный, как есть): Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
@Waz, спасибо за идеи! Просто хотел прояснить =>, то есть собственная стрелочная функция (ES6), ссылка переходит на документацию Mozillla на них, которая также предоставляет таблицу поддержки.
Большое спасибо ... ищите что-то короткое и точное
ES6 один лайнер
const toTitleCase = string => string.split(' ').map((word) => [word[0].toUpperCase(), ...word.substr(1)].join('')).join(' ');
ES 6
str.split(' ')
.map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
.join(' ')
еще
str.split(' ').map(function (s) {
return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
}).join(' ')
Напоминаем, что, вероятно, должен быть s.slice(0, 1).toUpperCase(), если вы все еще хотите эту первую букву.
@jssridhar вы также должны исправить код в ES6.
Прерывается, если str - одиночный символ
@jssridhar может быть лучше для нас .charAt(0).toUpperCase().
дубликат ответа a8m
Вот моя функция, которая заботится о акцентированных символах (важно для французского!) И может включать / выключать обработку исключений с понижением. Надеюсь, это поможет.
String.prototype.titlecase = function(lang, withLowers = false) {
var i, string, lowers, uppers;
string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}).replace(/Mc(.)/g, function(match, next) {
return 'Mc' + next.toUpperCase();
});
if (withLowers) {
if (lang == 'EN') {
lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not'];
}
else {
lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas'];
}
for (i = 0; i < lowers.length; i++) {
string = string.replace(new RegExp('\s' + lowers[i] + '\s', 'g'), function(txt) {
return txt.toLowerCase();
});
}
}
uppers = ['Id', 'R&d'];
for (i = 0; i < uppers.length; i++) {
string = string.replace(new RegExp('\b' + uppers[i] + '\b', 'g'), uppers[i].toUpperCase());
}
return string;
}
Если вы можете использовать в своем коде сторонние библиотеки, то у lodash есть для нас вспомогательная функция.
https://lodash.com/docs/4.17.3#startCase
_.startCase('foo bar');
// => 'Foo Bar'
_.startCase('--foo-bar--');
// => 'Foo Bar'
_.startCase('fooBar');
// => 'Foo Bar'
_.startCase('__FOO_BAR__');
// => 'FOO BAR'Попробуйте этот кратчайший путь:
str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());
Для тех из нас, кто боится регулярных выражений (смеется):
function titleCase(str)
{
var words = str.split(" ");
for ( var i = 0; i < words.length; i++ )
{
var j = words[i].charAt(0).toUpperCase();
words[i] = j + words[i].substr(1);
}
return words.join(" ");
}Это решение учитывает знаки препинания для новых предложений, обрабатывает цитаты, преобразует второстепенные слова в нижний регистр и игнорирует акронимы или слова, начинающиеся с заглавных букв.
var stopWordsArray = new Array("a", "all", "am", "an", "and", "any", "are", "as", "at", "be", "but", "by", "can", "can't", "did", "didn't", "do", "does", "doesn't", "don't", "else", "for", "get", "gets", "go", "got", "had", "has", "he", "he's", "her", "here", "hers", "hi", "him", "his", "how", "i'd", "i'll", "i'm", "i've", "if", "in", "is", "isn't", "it", "it's", "its", "let", "let's", "may", "me", "my", "no", "of", "off", "on", "our", "ours", "she", "so", "than", "that", "that's", "thats", "the", "their", "theirs", "them", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "to", "too", "try", "until", "us", "want", "wants", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "well", "went", "were", "weren't", "what", "what's", "when", "where", "which", "who", "who's", "whose", "why", "will", "with", "won't", "would", "yes", "yet", "you", "you'd", "you'll", "you're", "you've", "your");
// Only significant words are transformed. Handles acronyms and punctuation
String.prototype.toTitleCase = function() {
var newSentence = true;
return this.split(/\s+/).map(function(word) {
if (word == "") { return; }
var canCapitalise = true;
// Get the pos of the first alpha char (word might start with " or ')
var firstAlphaCharPos = word.search(/\w/);
// Check for uppercase char that is not the first char (might be acronym or all caps)
if (word.search(/[A-Z]/) > 0) {
canCapitalise = false;
} else if (stopWordsArray.indexOf(word) != -1) {
// Is a stop word and not a new sentence
word.toLowerCase();
if (!newSentence) {
canCapitalise = false;
}
}
// Is this the last word in a sentence?
newSentence = (word.search(/[\.!\?:]['"]?$/) > 0)? true : false;
return (canCapitalise)? word.replace(word[firstAlphaCharPos], word[firstAlphaCharPos].toUpperCase()) : word;
}).join(' ');
}
// Pass a string using dot notation:
alert("A critical examination of Plato's view of the human nature".toTitleCase());
var str = "Ten years on: a study into the effectiveness of NCEA in New Zealand schools";
str.toTitleCase());
str = "\"Where to from here?\" the effectivness of eLearning in childhood education";
alert(str.toTitleCase());
/* Result:
A Critical Examination of Plato's View of the Human Nature.
Ten Years On: A Study Into the Effectiveness of NCEA in New Zealand Schools.
"Where to From Here?" The Effectivness of eLearning in Childhood Education. */
Вот компактное решение проблемы:
function Title_Case(phrase)
{
var revised = phrase.charAt(0).toUpperCase();
for ( var i = 1; i < phrase.length; i++ ) {
if (phrase.charAt(i - 1) == " ") {
revised += phrase.charAt(i).toUpperCase(); }
else {
revised += phrase.charAt(i).toLowerCase(); }
}
return revised;
}
Я думаю, что проще всего использовать css.
function format_str(str) {
str = str.toLowerCase();
return '<span style = "text-transform: capitalize">'+ str +'</span>';
}
Я обновил код и протестировал его. Теперь он должен работать.
Вы можете использовать CSS только в той части сред, в которой используется JS, поэтому это решение нежизнеспособно. Также следует любой ценой избегать встроенных стилей.
@ Стив, он пройдет toLowerCase()?
Мы обсуждали здесь, в офисе, и думаем, что попытка автоматически исправить способ ввода имен людьми так, как вы хотите, чревата возможными проблемами.
Мы придумали несколько случаев, когда разные типы автоматической капитализации разваливаются. и это только для английских имен, у каждого языка есть свои сложности.
Проблемы с заглавными буквами в каждом имени:
• Запрещается вводить такие сокращения, как IBM, они будут преобразованы в Ibm.
• Имя Макдональд превратилось бы в Макдональд, что неверно, то же самое и с Макдональдсом.
• Двуствольные имена, такие как Мари-Тонкс, превратятся в Мари-Тонкс.
• Такие имена, как О'Коннор, превратятся в О'Коннор.
Для большинства из них вы можете написать собственные правила, чтобы справиться с этим, однако у этого все еще есть проблемы с Acronyms, как и раньше, и вы получаете новую проблему:
• Добавление правила для исправления имен с Mac, например MacDonald, приведет к тому, что имена, такие как Macy, будут прерваны, превратив его в MacY.
Единственное решение, которое мы придумали, которое никогда не бывает неправильным, - это использовать каждую букву с заглавной буквы, что является методом грубой силы, который, похоже, также использует DBS.
Так что, если вы хотите автоматизировать процесс, это практически невозможно без словаря каждого отдельного имени и слова и того, как они должны быть заглавными, Если у вас нет правила, охватывающего все, не используйте его, так как оно просто раздражает ваших пользователей и побуждает людей, которые хотят ввести свои имена правильно, перейти в другое место.
Вы можете проверить, кажется ли, что входная строка уже правильно оформлена, и только в том случае, если она не является (например, все нижние или все верхние), измените регистр своим наилучшим алгоритмом.
Сначала преобразуйте string в массив с помощью расщепление, пробелами:
var words = str.split(' ');
Затем используйте array.map, чтобы создать новый массив, содержащий слова с заглавной буквы.
var capitalized = words.map(function(word) {
return word.charAt(0).toUpperCase() + word.substring(1, word.length);
});
Затем присоединиться новый массив с пробелами:
capitalized.join(" ");
function titleCase(str) {
str = str.toLowerCase(); //ensure the HeLlo will become Hello at the end
var words = str.split(" ");
var capitalized = words.map(function(word) {
return word.charAt(0).toUpperCase() + word.substring(1, word.length);
});
return capitalized.join(" ");
}
console.info(titleCase("I'm a little tea pot"));ПРИМЕЧАНИЕ:
У этого, конечно, есть недостаток. Это будет использовать только первую букву каждого слова. Словом, это означает, что он обрабатывает каждую строку, разделенную моими пробелами, как 1 слово.
Предположительно у вас есть:
str = "I'm a little/small tea pot";
Это произведет
I'm A Little/small Tea Pot
по сравнению с ожидаемым
I'm A Little/Small Tea Pot
В этом случае использование Regex и .заменять поможет:
с ES6:
const capitalize = str => str.length
? str[0].toUpperCase() +
str.slice(1).toLowerCase()
: '';
const escape = str => str.replace(/./g, c => `\${c}`);
const titleCase = (sentence, seps = ' _-/') => {
let wordPattern = new RegExp(`[^${escape(seps)}]+`, 'g');
return sentence.replace(wordPattern, capitalize);
};
console.info( titleCase("I'm a little/small tea pot.") );или без ES6:
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.substring(1, str.length).toLowerCase();
}
function titleCase(str) {
return str.replace(/[^\ /\-\_]+/g, capitalize);
}
console.info(titleCase("I'm a little/small tea pot."));Я хотел добавить свой собственный ответ, так как мне нужна была надежная функция toTitleCase, которая учитывает правила грамматики перечислено здесь (рекомендованная Google статья). Существуют различные правила, которые зависят от длины входной строки. Ниже представлена функция + юнит-тесты.
Функция также объединяет пробелы и удаляет специальные символы (измените регулярное выражение для ваших нужд)
toTitleCase, функция
const toTitleCase = (str) => {
const articles = ['a', 'an', 'the'];
const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
const prepositions = [
'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
];
// The list of spacial characters can be tweaked here
const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
const normalizeStr = (str) => str.toLowerCase().trim();
const shouldCapitalize = (word, fullWordList, posWithinStr) => {
if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
return true;
}
return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
}
str = replaceCharsWithSpace(str);
str = normalizeStr(str);
let words = str.split(' ');
if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
words = words.map(w => capitalizeFirstLetter(w));
}
else {
for (let i = 0; i < words.length; i++) {
words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
}
}
return words.join(' ');
}
Модульные тесты для проверки правильности
import { expect } from 'chai';
import { toTitleCase } from '../../src/lib/stringHelper';
describe('toTitleCase', () => {
it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
});
it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
});
it('Replace special characters with space', function(){
expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
});
it('Trim whitespace at beginning and end', function(){
expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
});
it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
expect(toTitleCase('the three Musketeers And plus ')).to.equal('The Three Musketeers and Plus');
});
});
Обратите внимание, что я удаляю довольно много специальных символов из предоставленных строк. Вам нужно будет настроить регулярное выражение в соответствии с требованиями вашего проекта.
Я предпочитаю это решение, так как оно действительно заботится о регистре заголовков. Это не "Унесенные ветром", это "Унесенные ветром"
Я предпочитаю следующие ответы другим. Он соответствует только первой букве каждого слова и делает ее заглавной. Более простой код, легче читать и меньше байтов. Он сохраняет существующие заглавные буквы, чтобы предотвратить искажение сокращений. Однако вы всегда можете сначала вызвать toLowerCase() в своей строке.
function title(str) {
return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}
Вы можете добавить это в свой строковый прототип, который позволит вам использовать 'my string'.toTitle() следующим образом:
String.prototype.toTitle = function() {
return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}
Пример:
String.prototype.toTitle = function() {
return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}
console.info('all lower case ->','all lower case'.toTitle());
console.info('ALL UPPER CASE ->','ALL UPPER CASE'.toTitle());
console.info("I'm a little teapot ->","I'm a little teapot".toTitle());Еще приятнее, как лямбда const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
Я не хотел ломать IE, но да, если приложение не чувствительно к устаревшим браузерам, оно могло быть короче.
Это только частичное решение - op спросил, как преобразовать строку в регистр заголовка. Этот ответ не подходит для таких входов, как NoT qUiITe.
@Madbreaks В вопросе не оговаривается, что необходимо преобразовывать входные данные со смешанным регистром. Однако я обновил ответ, в котором упоминается toLowerCase. Просто имейте в виду, что это приведет к разрыву аббревиатур. an HTML document: An HTML Document против An Html Document
Но «заглавный регистр» имеет значение. Предложение, состоящее только из заглавных букв, не может считаться заглавным регистром, и ваш ответ допускает это. en.wikipedia.org/wiki/Letter_case#Title_case - Мне нравится ваш ответ, но в данном контексте он неполный.
@Madbreaks Хотя ваш первоначальный пример был надуманным, вы хорошо замечаете, что вывод не изменился бы, если бы ввод был написан с заглавной буквы. При этом я считаю, что ответ как есть (с поправкой, предлагающей toLowerCase) более гибкий / полезный, чем тот, который предполагает намерения разработчиков. Этот метод также отражает функциональность аналогичных встроенных методов других языков, таких как PHP (ucwords) и Golang (strings.Title). .NET (TextInfo.ToTitleCase) интересно работает для смешанного случая, но также оставит полностью заглавные строки без изменений.
Спасибо - я не заметил, как вы добавили toLowerCase, который мне подходит. +1, ура
К сожалению, \b не совсем соответствует вашим ожиданиям со словами, содержащими апострофы. title("I'm a little teapot") => "I'M A Little Teapot"
спасибо за обратную связь @rcoup - если я переключу его на соответствие (пробел или начало строки), можете ли вы подумать о каких-либо проблемах с обратной совместимостью по сравнению с границей?
Предложения @TomKay / запятые / точка с запятой / дефисы будут проблемой.
Было несколько отличных ответов, но многие люди используют регулярное выражение для поиска слова, но по какой-то причине никто другой не использует регулярное выражение для замены первого символа. Для объяснения я предоставлю длинное решение и более короткое.
Долгое решение (более пояснительное). Используя регулярное выражение [^\s_\-/]*, мы можем найти каждое слово в предложении. Впоследствии мы можем использовать регулярное выражение . для сопоставления с первым символом в слове. Используя версию replace с регулярным выражением для обоих из них, мы можем изменить решение следующим образом:
function toUpperCase(str) { return str.toUpperCase(); }
function capitalizeWord(word) { return word.replace(/./, toUpperCase); }
function capitalize(sentence) { return sentence.toLowerCase().replace(/[^\s_\-/]*/g, capitalizeWord); }
console.info(capitalize("hello world")); // Outputs: Hello WorldДля одной функции, которая делает то же самое, мы вкладываем вызовы replace следующим образом:
function capitalize(sentence) {
return sentence.toLowerCase().replace(/[^\s_\-/]*/g, function (word) {
return word.replace(/./, function (ch) { return ch.toUpperCase(); } );
} );
}
console.info(capitalize("hello world")); // Outputs: Hello Worldthis is a test ---> This Is A Test
function capitalize(str) {
const word = [];
for (let char of str.split(' ')) {
word.push(char[0].toUpperCase() + char.slice(1))
}
return word.join(' ');
}
console.info(capitalize("this is a test"));Использование метода уменьшить
function titleCase(str) {
const arr = str.split(" ");
const result = arr.reduce((acc, cur) => {
const newStr = cur[0].toUpperCase() + cur.slice(1).toLowerCase();
return acc += `${newStr} `
},"")
return result.slice(0, result.length-1);
}Другой подход к достижению чего-то подобного может заключаться в следующем.
formatName(name) {
let nam = '';
name.split(' ').map((word, index) => {
if (index === 0) {
nam += word.split('').map((l, i) => i === 0 ? l.toUpperCase() : l.toLowerCase()).join('');
} else {
nam += ' ' + word.split('').map(l => l.toLowerCase()).join('');
}
});
return nam;
}
ES-6 way to get title case of a word or entire line.
ex. input = 'hEllo' --> result = 'Hello'
ex. input = 'heLLo woRLd' --> result = 'Hello World'
const getTitleCase = (str) => {
if (str.toLowerCase().indexOf(' ') > 0) {
return str.toLowerCase().split(' ').map((word) => {
return word.replace(word[0], word[0].toUpperCase());
}).join(' ');
}
else {
return str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase();
}
}
вот еще одно решение с использованием css (и javascript, если текст, который вы хотите преобразовать, находится в верхнем регистре):
html
<span id='text'>JOHN SMITH</span>
js
var str = document.getElementById('text').innerHtml;
var return_text = str.toLowerCase();
css
#text{text-transform:capitalize;}
https://lodash.com/docs/4.17.11#capitalize
Используйте библиотеку Lodash .. !! Более надежный
_.capitalize('FRED'); => 'Fred'
Не работает для слов после первого: _.capitalize ('john smith') => 'John smith'. Использование _.VERSION = 4.17.11
Более надежный, но более раздутый.
Поменять его на _.startCase('john smith'); => 'John Smith' будет правильно.
@ Ecker00, да, но это ответ существовал в 2016 году.
Джон Смит -> Джон Смит
'john smith'.replace(/(^\w|\s+\w){1}/g, function(str){ return str.toUpperCase() } );
"john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())
Работает для образца и o'henry, но делает странные вещи с horse's mouth.
"john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase()) лучше ?
Не хотел редактировать ответ @ Proximo: \b и \S - это специальные классы персонажей, обозначающие «границу слова» и «одиночный непробельный символ. Таким образом, регулярное выражение соответствует каждому символу, следующему за границей слова, и использует этот символ с заглавной буквы, применяя заданную стрелочную функцию.
Мое однострочное решение:
String.prototype.capitalizeWords = function() {
return this.split(" ").map(function(ele){ return ele[0].toUpperCase() + ele.slice(1).toLowerCase();}).join(" ");
};
Затем вы можете вызвать метод capitalizeWords() для любой строки. Например:
var myS = "this actually works!";
myS.capitalizeWords();
>>> This Actually Works
Мое другое решение:
function capitalizeFirstLetter(word) {
return word[0].toUpperCase() + word.slice(1).toLowerCase();
}
String.prototype.capitalizeAllWords = function() {
var arr = this.split(" ");
for(var i = 0; i < arr.length; i++) {
arr[i] = capitalizeFirstLetter(arr[i]);
}
return arr.join(" ");
};
Затем вы можете вызвать метод capitalizeWords() для любой строки. Например:
var myStr = "this one works too!";
myStr.capitalizeWords();
>>> This One Works Too
Альтернативное решение, основанное на ответе Грега Дина:
function capitalizeFirstLetter(word) {
return word[0].toUpperCase() + word.slice(1).toLowerCase();
}
String.prototype.capitalizeWords = function() {
return this.replace(/\w\S*/g, capitalizeFirstLetter);
};
Затем вы можете вызвать метод capitalizeWords() для любой строки. Например:
var myString = "yes and no";
myString.capitalizeWords()
>>> Yes And No
Решение с использованием lodash -
import { words, lowerCase, capitalize, endsWith, padEnd } from 'lodash';
const titleCase = string =>
padEnd(
words(string, /[^ ]+/g)
.map(lowerCase)
.map(capitalize)
.join(' '),
string.length,
);
почему не _.startCase('john smith');? lodash.com/docs/4.17.15#startCase
_.startCase удаляет все специальные символы, которые присутствуют в вашей строке. _.startCase('john-smith') => John Smith. Кроме того, если вся строка в верхнем регистре и если вы хотите, чтобы только первые символы были заглавными, startCase не помогает. _.startCase('JOHN SMITH') => JOHN SMITH
аааа, не знал о заглавных буквах. а в таком случае мы можем использовать _.startCase('HELLO'.toLowerCase())?
Я думаю, вам стоит попробовать эту функцию.
var toTitleCase = function (str) {
str = str.toLowerCase().split(' ');
for (var i = 0; i < str.length; i++) {
str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1);
}
return str.join(' ');
};
Что, если я хочу создать метод toTitleCase(), пригодный для использования так же, как «родной» toLowerCase(): str.toTitleCase()?
Мой список основан на трех быстрых поисках. Один для списка слов, которые не должны начинаться с заглавной буквы, и один для полного списка предлогов.
Один последний поиск сделал предложение, что предлоги 5 или более букв должны быть заглавными, что мне понравилось. Моя цель - неформальное использование. Я оставил «без» в их, потому что это очевидный аналог с.
Таким образом, в нем используются заглавные буквы, первая буква названия и первая буква большинства слов.
Он не предназначен для обработки слов с заглавными буквами. Я хотел оставить их в покое.
function camelCase(str) {
return str.replace(/((?:^|\.)\w|\b(?!(?:a|amid|an|and|anti|as|at|but|but|by|by|down|for|for|for|from|from|in|into|like|near|nor|of|of|off|on|on|onto|or|over|past|per|plus|save|so|than|the|to|to|up|upon|via|with|without|yet)\b)\w)/g, function(character) {
return character.toUpperCase();
})}
console.info(camelCase('The quick brown fox jumped over the lazy dog, named butter, who was taking a nap outside the u.s. Post Office. The fox jumped so high that NASA saw him on their radar.'));Что, если я хочу создать метод toTitleCase(), пригодный для использования точно так же, как «родной» toLowerCase(): str.toTitleCase(), как бы вы это сделали?
@RazvanZamfir Вы можете изменить строку prototype. Можно сделать String.prototype.toTitleCase = function() {...}codementor.io/@dhruvkumarjha/…
Простой способ преобразовать отдельное слово в регистр заголовка
Использование метода "Slice" и конкатенации строк
str.slice(0, 1).toUpperCase() + str.slice(1, str.length)
* Добавьте .toLowerCase () в конец, если вы хотите, чтобы остальная часть слова была строчной.
Использование ES6 Spread Operator, Map и Join
[...str].map((w, i) => i === 0 ? w[0].toUpperCase() : w).join('')
Удивлен, что никто не упомянул об использовании параметра rest. Вот простой лайнер, использующий параметры ES6 Rest.
let str = "john smith"
str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
console.info(str)ваах пандей джи. Благодарность
Однострочное выражение с использованием регулярного выражения, получение всех начальных символов \g слов \b[a-zA-Z] и применение .toUpperCase()
const textString = "Convert string to title case with Javascript.";
const converted = textString.replace(/\b[a-zA-Z]/g, (match) => match.toUpperCase());
console.info(converted)Вот действительно простая и лаконичная функция ES6 для этого:
const titleCase = (str) => {
return str.replace(/\w\S*/g, (t) => { return t.charAt(0).toUpperCase() + t.substr(1).toLowerCase() });
}
export default titleCase;
Хорошо работает в папке utilities и используется следующим образом:
import titleCase from './utilities/titleCase.js';
const string = 'my title & string';
console.info(titleCase(string)); //-> 'My Title & String'
Я не рекомендовал использовать startCase Lodash, поскольку он удаляет такие символы, как '&'
Победителем этого теста стал старый добрый цикл for:
function titleize(str) {
let upper = true
let newStr = ""
for (let i = 0, l = str.length; i < l; i++) {
// Note that you can also check for all kinds of spaces with
// str[i].match(/\s/)
if (str[i] == " ") {
upper = true
newStr += str[i]
continue
}
newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase()
upper = false
}
return newStr
}
// NOTE: you could beat that using charcode and string builder I guess.
Я взял самые популярные и четкие ответы и сделал с ними эталон.
Вот результат на моем MacBook Pro:
И для полноты, вот используемые функции:
str = "the QUICK BrOWn Fox jUMPS oVeR the LAzy doG";
function regex(str) {
return str.replace(
/\w\S*/g,
function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}
);
}
function split(str) {
return str.
split(' ').
map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).
join(' ');
}
function complete(str) {
var i, j, str, lowers, uppers;
str = str.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
// Certain minor words should be left lowercase unless
// they are the first or last words in the string
lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At',
'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
for (i = 0, j = lowers.length; i < j; i++)
str = str.replace(new RegExp('\s' + lowers[i] + '\s', 'g'),
function(txt) {
return txt.toLowerCase();
});
// Certain words such as initialisms or acronyms should be left uppercase
uppers = ['Id', 'Tv'];
for (i = 0, j = uppers.length; i < j; i++)
str = str.replace(new RegExp('\b' + uppers[i] + '\b', 'g'),
uppers[i].toUpperCase());
return str;
}
function firstLetterOnly(str) {
return str.replace(/\b(\S)/g, function(t) { return t.toUpperCase(); });
}
function forLoop(str) {
let upper = true;
let newStr = "";
for (let i = 0, l = str.length; i < l; i++) {
if (str[i] == " ") {
upper = true;
newStr += " ";
continue;
}
newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase();
upper = false;
}
return newStr;
}
Обратите внимание, что я намеренно не менял прототип, так как считаю это действительно плохой практикой, и я не думаю, что мы должны продвигать такую практику в наших ответах. Это нормально только для небольших кодовых баз, когда вы единственный, кто работаете над этим.
Если вы хотите добавить какой-либо другой способ сделать это в этот тест, прокомментируйте, пожалуйста, ссылку на ответ!
Вот мой ответ Ребята прокомментируйте и поставьте лайк, если ваша проблема решена.
function toTitleCase(str) {
return str.replace(
/(\w*\W*|\w*)\s*/g,
function(txt) {
return(txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())
}
);
}<form>
Input:
<br /><textarea name = "input" onchange = "form.output.value=toTitleCase(this.value)" onkeyup = "form.output.value=toTitleCase(this.value)"></textarea>
<br />Output:
<br /><textarea name = "output" readonly onclick = "select(this)"></textarea>
</form>Будьте осторожны со словами со знаками. Например: cördoba отображается как CöRdoba
Благодарим за ваше предложение. Я буду обновлять свой ответ, когда получу решение.
Есть разные методы, есть ли у нас статистика производительности?