Как сделать первую букву строки заглавной, но не изменить регистр любой другой буквы?
Например:
"this is a test"
->"This is a test"
"the Eiffel Tower"
->"The Eiffel Tower"
"/index.html"
->"/index.html"
javascript
string
letter
capitalize
Роберт Уиллс
источник
источник
return str.replace(/(\b\w)/gi,function(m){return m.toUpperCase();});
string[0].toUpperCase() + string.substring(1)
`${s[0].toUpperCase()}${s.slice(1)}`
([initial, ...rest]) => [initial.toUpperCase(), ...rest].join("")
Ответы:
Основное решение:
Некоторые другие ответы изменяются
String.prototype
(этот ответ также использовался), но я бы посоветовал против этого сейчас из-за удобства сопровождения (сложно определить, куда добавляется функция,prototype
и может вызвать конфликты, если другой код использует то же имя / браузер добавляет нативную функцию с тем же именем в будущем).... и затем, когда вы рассматриваете интернационализацию, в этом вопросе есть еще много всего, как показывает этот удивительно хороший ответ (похоронен ниже).
Если вы хотите работать с кодовыми точками Unicode вместо кодовых единиц (например, для обработки символов Unicode вне Базовой многоязычной плоскости), вы можете использовать тот факт, что
String#[@iterator]
работает с кодовыми точками, и вы можете использоватьtoLocaleUpperCase
для получения корректного локали в верхнем регистре:Для еще большего количества вариантов интернационализации, пожалуйста, смотрите оригинальный ответ ниже .
источник
the Eiffel Tower -> The Eiffel Tower
. Плюс функция называетсяcapitaliseFirstLetter
не такcapitaliseFirstLetterAndLowerCaseAllTheOthers
.string[0].toUpperCase() + string.substring(1)
Вот более объектно-ориентированный подход:
Вы бы вызвали функцию, вот так:
Ожидаемый результат:
источник
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
В CSS:
источник
Вот сокращенная версия популярного ответа, который получает первую букву, рассматривая строку как массив:
Обновить:
Согласно комментариям ниже, это не работает в IE 7 или ниже.
Обновление 2:
Чтобы избежать
undefined
пустых строк (см . Комментарий @ njzk2 ниже ), вы можете проверить наличие пустой строки:источник
return s && s[0].toUpperCase() + s.slice(1);
Если вы заинтересованы в производительности нескольких различных методов, опубликованных:
Вот самые быстрые методы, основанные на этом тесте jsperf (упорядоченные от самого быстрого до самого медленного).
Как вы можете видеть, первые два метода по существу сопоставимы с точки зрения производительности, тогда как изменение
String.prototype
является самым медленным с точки зрения производительности.источник
.slice(1)
на.substr(1)
это повысит производительность еще больше.В другом случае мне нужно, чтобы первая буква была заглавной, а остальные строчными. Следующие случаи заставили меня изменить эту функцию:
источник
Это решение ECMAScript 6+ 2018 года :
источник
.slice()
медленнее, чем.substring()
,str[0]
будетundefined
для пустой строки и использование литералов шаблона для объединения двух частей вводит здесь 8 символов, а+
вводит только 3.${}
просто добавляет шума.const newStr = str[0].toUpperCase() + str.slice(1);
легче читать.Если вы уже (или рассматриваете) использование
lodash
, решение легко:Смотрите их документы: https://lodash.com/docs#capitalize
_.camelCase('Foo Bar'); //=> 'fooBar'
https://lodash.com/docs/4.15.0#camelCase
Ваниль JS для первого верхнего регистра:
источник
Прописать первую букву всех слов в строке:
источник
s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
Мы могли бы получить первого персонажа с одним из моих любимых
RegExp
, похожим на милый смайлик:/^./
И для всех любителей кофе:
... и для всех парней, которые думают, что есть лучший способ сделать это без расширения собственных прототипов:
источник
'Answer'.replace(/^./, v => v.toLowerCase())
Использование:
Он выведет
"Ruby java"
на консоль.источник
Если вы используете underscore.js или Lo-Dash , библиотека underscore.string предоставляет расширения строк, включая прописные:
Пример:
источник
_.capitalize("foo") === "Foo"
.humanize
. Он преобразует подчеркнутую, верблюжью или разбитую строку в гуманизированную. Также удаляет начальные и конечные пробелы и удаляет постфикс «_id».А потом:
Обновление ноябрь 2016 (ES6), просто для удовольствия:
тогда
capitalize("hello") // Hello
источник
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();
.Кратчайшие 3 решения, 1 и 2 обрабатывают случаи, когда
s
строка есть""
,null
иundefined
:Показать фрагмент кода
источник
Только CSS
::first-letter
, он применяется к первому символу , т. Е. В случае строки%a
, этот селектор будет применяться%
и как таковойa
не будет написан заглавными буквами.:first-letter
).ES2015 однострочный
Поскольку существует множество ответов, но в ES2015 нет ни одного, который бы эффективно решал исходную проблему, я придумал следующее:
замечания
parameters => function
это так называемая функция стрелки .capitalizeFirstChar
вместоcapitalizeFirstLetter
, потому что OP не запрашивал код, который использует первую букву во всей строке, а самый первый символ (если, конечно, это буква).const
дает нам возможность объявлятьcapitalizeFirstChar
как константу, что желательно, поскольку как программист вы всегда должны явно указывать свои намерения.string.charAt(0)
иstring[0]
. Однако обратите внимание, чтоstring[0]
это будетundefined
для пустой строки, поэтому ее следует переписать вstring && string[0]
слишком многословно по сравнению с альтернативой.string.substring(1)
быстрее чемstring.slice(1)
.эталонный тест
источник
Существует очень простой способ реализовать его путем замены . Для ECMAScript 6:
Результат:
источник
/^[a-z]/i
будет лучше, чем использование, так.
как предыдущий не будет пытаться заменить любой другой символ, кроме алфавитаЯ не видел никаких упоминаний в существующих ответах на вопросы, касающиеся
кодовых точек астрального плана илиинтернационализации. «Прописные буквы» не означают одно и то же в каждом языке, использующем данный скрипт.Изначально я не видел ответов на вопросы, связанные с кодовыми точками астрального плана. Там является один , но это немного похоронен (как это один будет, я думаю!)
Большинство предлагаемых функций выглядят так:
Тем не менее, некоторые прописные символы находятся за пределами BMP (базовая многоязычная плоскость, кодовые точки от U + 0 до U + FFFF). Например, возьмите этот текст Deseret:
Первый символ здесь не может быть написан заглавными буквами, потому что индексированные по массиву свойства строк не имеют доступа к «символам» или кодовым точкам *. Они имеют доступ к кодовым единицам UTF-16. Это верно и при разрезании - значения индекса указывают на единицы кода.
Случается, что кодовые единицы UTF-16 имеют размер 1: 1 с кодовыми точками USV в двух диапазонах, от U + 0 до U + D7FF и от U + E000 до U + FFFF включительно. Большинство описанных персонажей попадают в эти два диапазона, но не все.
С ES2015 справиться с этим стало немного легче.
String.prototype[@@iterator]
дает строки, соответствующие кодовым точкам **. Так, например, мы можем сделать это:Для более длинных строк это, вероятно, не очень эффективно *** - нам не нужно итерировать остаток. Мы могли бы использовать,
String.prototype.codePointAt
чтобы получить это первое (возможное) письмо, но нам все еще нужно было бы определить, где должен начинаться срез. Один из способов избежать итерации остатка - проверить, находится ли первая кодовая точка вне BMP; если это не так, срез начинается с 1, а если это так, срез начинается с 2.Вы могли бы использовать побитовую математику вместо
> 0xFFFF
этого, но, вероятно, легче понять этот путь, и любой из них достиг бы того же самого.Мы также можем сделать эту работу в ES5 и ниже, взяв эту логику немного дальше, если это необходимо. В ES5 нет встроенных методов для работы с кодовыми точками, поэтому мы должны вручную проверить, является ли первая единица кода суррогатом ****:
В начале я также упомянул соображения интернационализации. Некоторые из них очень трудно объяснить, потому что они требуют знания не только того, какой язык используется, но также могут требовать определенных знаний слов в языке. Например, ирландский орграф "mb" пишется с заглавной буквы как "mB" в начале слова. Другой пример, немецкий eszett, никогда не начинает слово (afaik), но все же помогает проиллюстрировать проблему. Строчные буквы eszett («ß») пишутся с заглавной буквы «SS», но «SS» может быть строчными или «ß», или «ss» - вам необходимо внеполосное знание немецкого языка, чтобы знать, что правильно!
Наиболее известный пример такого рода проблем, вероятно, турецкий. В турецкой латыни заглавная форма i - это İ, а строчная форма I - ı - это две разные буквы. К счастью, у нас есть способ объяснить это:
В браузере наиболее предпочтительный языковой тег пользователя обозначен значком
navigator.language
, в нем находится список в порядке предпочтенияnavigator.languages
, а язык данного элемента DOM может быть получен (обычно)Object(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
в многоязычных документах.В агентах, которые поддерживают классы символов свойств Unicode в RegExp, которые были представлены в ES2018, мы можем очистить вещи дальше, напрямую выражая, какие символы нас интересуют:
Это можно немного подправить, чтобы обрабатывать несколько слов в строке с большой точностью.
CWU
Или Changes_When_Uppercased свойство символов соответствует всем точкам кода , которые, ну, когда изменения в верхнем регистре. Мы можем попробовать это с помощью заглавных букв, таких как голландский ij, например:На момент написания статьи (февраль 2020 г.) Firefox / Spidermonkey еще не реализовал ни одной из функций RegExp, представленных за последние два года *****. Вы можете проверить текущее состояние этой функции в таблице сравнения Kangax . Babel может компилировать литералы RegExp со ссылками на свойства для эквивалентных шаблонов без них, но имейте в виду, что результирующий код может быть огромным.
По всей вероятности, люди, задающие этот вопрос, не будут беспокоиться о капитализации или интернационализации Deseret. Но хорошо знать об этих проблемах, потому что есть большая вероятность, что вы в конечном итоге столкнетесь с ними, даже если в настоящее время они не являются проблемой. Это не «крайние» случаи, или, скорее, они не являются крайними случаями по определению - во всяком случае, существует целая страна, где большинство людей говорят по-турецки, и объединение блоков кода с кодовыми точками является довольно распространенным источником ошибок (особенно в что касается смайликов). И строки, и язык довольно сложны!
* Кодовые единицы UTF-16 / UCS2 также являются кодовыми точками Unicode в том смысле, что, например, U + D800 технически является кодовой точкой, но это не то, что здесь «означает» ... вроде ... хотя это и получается довольно нечеткая. Что суррогаты определенно не являются, тем не менее, являются USV (скалярные значения Unicode).
** Хотя, если единица суррогатного кода «осиротела», то есть не является частью логической пары, вы все равно можете получить здесь и суррогаты.
*** может быть. Я не проверял это. Если вы не определили, что использование заглавных букв является значительным узким местом, я бы, наверное, не потел бы с этим - выбирайте то, что вы считаете наиболее понятным и читабельным.
**** такая функция может захотеть проверить как первую, так и вторую кодовые единицы, а не только первую, поскольку вполне возможно, что первая единица является суррогатом-сиротой. Например, ввод «\ uD800x» будет использовать заглавную букву X как есть, чего можно ожидать или не ожидать.
***** Вот проблема Bugzilla, если вы хотите следить за прогрессом более непосредственно.
источник
В CSS это выглядит проще:
Это из CSS text-transform Property (в W3Schools ).
источник
источник
Всегда лучше сначала обрабатывать такие вещи с помощью CSS , в общем, если вы можете решить что-то с помощью CSS, сначала сделайте это, затем попробуйте JavaScript, чтобы решить ваши проблемы, поэтому в этом случае попробуйте использовать
:first-letter
в CSS и применитьtext-transform:capitalize;
Так что попробуйте создать класс для этого, чтобы вы могли использовать его глобально, например:
.first-letter-uppercase
и добавить что-то вроде ниже в свой CSS:Также альтернативным вариантом является JavaScript, поэтому лучше всего будет что-то вроде этого:
и назовите это как:
Если вы хотите использовать его снова и снова, лучше присоединить его к нативной String javascript, так что-то вроде ниже:
и назовите это как ниже:
источник
Если вы хотите переформатировать весь заглавные буквы, вы можете изменить другие примеры следующим образом:
Это обеспечит изменение следующего текста:
источник
источник
substr
/substring
немного более семантически, чем этоslice
, но это просто вопрос предпочтений. Тем не менее, я включил примеры со строками, приведенными в вопросе, что приятно, но не в примере '09. Я, честно говоря, считаю, что 15-летняя я хочу карму на StackOverflow;)Вот функция ucfirst () (сокращение от «первая буква верхнего регистра»):
Вы можете использовать строку с заглавной буквы, вызывая ucfirst («некоторая строка») - например,
Это работает, разделив строку на две части. В первой строке он извлекает firstLetter, а затем во второй строке он использует прописную букву firstLetter , вызывая firstLetter.toUpperCase (), и соединяет его с остальной частью строки, которая определяется путем вызова str.substr (1) .
Вы можете подумать, что это не сработает для пустой строки, и на самом деле на языке, подобном C, вам придется учитывать это. Однако в JavaScript, когда вы берете подстроку пустой строки, вы просто возвращаете пустую строку.
источник
substr()
это устарело? Это даже не сейчас, три года спустя, не говоря уже о том, чтобы в 2009 году вы сделали этот комментарий.substr()
может не помечаться как устаревшая в любой популярной реализации ECMAScript (я сомневаюсь, что она не исчезнет в ближайшее время), но это не является частью спецификации ECMAScript. Третье издание спецификации упоминает его в ненормативном приложении, чтобы «предложить единую семантику для таких свойств, не делая свойства или их семантику частью этого стандарта».substring
,substr
иslice
) слишком много, ИМО. Я всегда использую,slice
потому что он поддерживает отрицательные индексы, у него нет запутывающего поведения подстановки аргументов, и его API похож наslice
другие языки.Применение:
Это текстовая строка => Это текстовая строка
источник
return.this.toLocaleLowerCase().replace(
...String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); };
Я немного рефакторинг вашего кода, вам нужно только первое совпадение.источник
Оформить заказ это решение:
источник
stringVal.replace(/^./, stringVal[0].toUpperCase());
stringVal[0]
было быundefined
пустымstringVal
, и как таковая попытка доступа к свойству.toUpperCase()
выкинула бы ошибку.(Вы можете инкапсулировать его в функцию или даже добавить его в прототип String, если будете часто его использовать.)
источник
ucfirst
Функция работает , если вы делаете это так.Спасибо JP за акларацию.
источник
string[0].toUpperCase() + string.substring(1)
(string[0] || '').toUpperCase() + string.substring(1)
(string[0] || '')
вы могли бы простоstring.charAt(0)
.Вы можете сделать это в одну строку, как это
источник
Я нашел эту функцию стрелки проще всего. Replace соответствует первой букве символа (
\w
) вашей строки и преобразует ее в верхний регистр. Ничего более причудливого не нужно.источник
/./
по двум причинам:/\w/
пропустит все предыдущие не буквенные символы (поэтому @@ abc станет @@ Abc), а затем не будет работать с