Jak zrobić pierwszą literę ciągu wielkimi literami, ale nie zmieniać wielkości liter w pozostałych literach?
Na przykład:
"this is a test"
->"This is a test"
"the Eiffel Tower"
->"The Eiffel Tower"
"/index.html"
->"/index.html"
javascript
string
letter
capitalize
Robert Wills
źródło
źródło
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("")
Odpowiedzi:
Podstawowym rozwiązaniem jest:
Niektóre inne odpowiedzi zmieniają się
String.prototype
(ta odpowiedź również kiedyś), ale odradzałbym to teraz ze względu na łatwość konserwacji (trudny do ustalenia, gdzie funkcja jest dodawana doprototype
i może powodować konflikty, jeśli inny kod używa tej samej nazwy / przeglądarki) dodaje funkcję natywną o tej samej nazwie w przyszłości).... a potem, gdy rozważasz internacjonalizację, jest o wiele więcej, o czym świadczy ta zadziwiająco dobra odpowiedź (ukryta poniżej).
Jeśli chcesz pracować z punktami kodowymi Unicode zamiast z jednostkami kodowymi (na przykład, aby obsługiwać znaki Unicode poza Podstawową płaszczyzną wielojęzyczną), możesz wykorzystać fakt, że
String#[@iterator]
działa on z punktami kodowymi, i możesz użyć,toLocaleUpperCase
aby uzyskać poprawne ustawienia regionalne:Aby uzyskać jeszcze więcej opcji internacjonalizacji, zobacz oryginalną odpowiedź poniżej .
źródło
the Eiffel Tower -> The Eiffel Tower
. Dodatkowo funkcja nazywa się „capitaliseFirstLetter
nie”capitaliseFirstLetterAndLowerCaseAllTheOthers
.string[0].toUpperCase() + string.substring(1)
Oto podejście bardziej obiektowe:
Wywołalibyśmy tę funkcję w następujący sposób:
Oczekiwany wynik to:
źródło
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
W CSS:
źródło
Oto skrócona wersja popularnej odpowiedzi, która otrzymuje pierwszą literę, traktując ciąg znaków jako tablicę:
Aktualizacja:
Zgodnie z poniższymi komentarzami nie działa to w IE 7 lub niższej.
Aktualizacja 2:
Aby uniknąć
undefined
pustych łańcuchów (patrz komentarz @ njzk2 poniżej ), możesz sprawdzić, czy łańcuch jest pusty:źródło
return s && s[0].toUpperCase() + s.slice(1);
Jeśli jesteś zainteresowany wydajnością kilku różnych opublikowanych metod:
Oto najszybsze metody oparte na tym teście jsperf (uporządkowane od najszybszego do najwolniejszego).
Jak widać, pierwsze dwie metody są zasadniczo porównywalne pod względem wydajności, podczas gdy zmiana
String.prototype
jest zdecydowanie najwolniejsza pod względem wydajności.źródło
.slice(1)
go.substr(1)
jeszcze bardziej zwiększy wydajność.W innym przypadku potrzebuję go, aby pierwsza litera była wielką literą, a pozostałe małe. Następujące przypadki zmusiły mnie do zmiany tej funkcji:
źródło
Oto rozwiązanie ECMAScript 6+ 2018 :
źródło
.slice()
jest wolniejszy niż.substring()
,str[0]
byłbyundefined
to pusty ciąg i użycie literałów szablonów do połączenia dwóch części wprowadza tutaj 8 znaków, a+
wprowadziłby tylko 3.${}
prostu dodaje hałasu.const newStr = str[0].toUpperCase() + str.slice(1);
jest łatwiejszy do odczytania.Jeśli już korzystasz (lub rozważasz)
lodash
, rozwiązanie jest proste:Zobacz ich dokumenty: https://lodash.com/docs#capitalize
_.camelCase('Foo Bar'); //=> 'fooBar'
https://lodash.com/docs/4.15.0#camelCase
Vanilla js na pierwszą wielką literę:
źródło
Wielką literą wszystkich słów w ciągu powinna być wielka litera:
źródło
s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
Możemy dostać pierwszą postać z jedną z moich ulubionych
RegExp
, wygląda jak słodka buźka:/^./
I dla wszystkich ćpunów kawy:
... i dla wszystkich facetów, którzy myślą, że jest lepszy sposób na to, bez rozszerzania natywnych prototypów:
źródło
'Answer'.replace(/^./, v => v.toLowerCase())
Posługiwać się:
Wyjdzie
"Ruby java"
na konsolę.źródło
Jeśli używasz underscore.js lub Lo-Dash , biblioteka underscore.string zapewnia rozszerzenia ciągów, w tym wielkie litery:
Przykład:
źródło
_.capitalize("foo") === "Foo"
.humanize
. Przekształca podkreśloną, wielbłądzią lub przerywaną strunę w humanizowaną. Usuwa również początkowe i końcowe białe znaki oraz usuwa postfiks „_id”.I wtedy:
Zaktualizuj listopad 2016 (ES6), tylko dla ZABAWY:
następnie
capitalize("hello") // Hello
źródło
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();
.NAJKRÓTSZA 3 rozwiązania, 1 i 2 przypadki, gdy uchwyt
s
ciąg jest""
,null
iundefined
:Pokaż fragment kodu
źródło
Tylko CSS
::first-letter
, odnosi się do pierwszego znaku , tj. W przypadku łańcucha%a
, ten selektor miałby zastosowanie do%
i jako takia
nie byłby pisany wielkimi literami.:first-letter
).ES2015 z jedną wkładką
Ponieważ istnieje wiele odpowiedzi, ale w ES2015 nie ma takich, które mogłyby skutecznie rozwiązać pierwotny problem, wymyśliłem:
Uwagi
parameters => function
jest tak zwaną funkcją strzałki .capitalizeFirstChar
zamiastcapitalizeFirstLetter
, ponieważ OP nie poprosił o kod, który zapisuje wielką literę w całym ciągu, ale pierwszy znak (jeśli oczywiście jest to litera).const
daje nam możliwość deklaracjicapitalizeFirstChar
jako stałej, co jest pożądane, ponieważ jako programista zawsze powinieneś wyraźnie określać swoje zamiary.string.charAt(0)
istring[0]
. Zauważ jednak, żestring[0]
byłby toundefined
pusty ciąg, więc należy go przepisać nastring && string[0]
, co jest zbyt szczegółowe, w porównaniu do alternatywy.string.substring(1)
jest szybszy niżstring.slice(1)
.Reper
źródło
Istnieje bardzo prosty sposób na wdrożenie go przez zastąpienie . W przypadku ECMAScript 6:
Wynik:
źródło
/^[a-z]/i
będzie lepsze niż używanie.
jako poprzednie, ponieważ nie będzie próbował zastąpić żadnego znaku innego niż alfabetW CSS wydaje się to łatwiejsze:
Pochodzi z CSS Text-Transform Property (w W3Schools ).
źródło
źródło
Nie widziałem żadnej wzmianki w istniejących odpowiedziach na problemy związane z
punktami kodu samolotu astralnego lubinternacjonalizacją. „Wielkie litery” nie oznaczają tego samego w każdym języku używającym danego skryptu.Początkowo nie widziałem żadnych odpowiedzi dotyczących problemów związanych z punktami kodu płaszczyzny astralnej. Jest jeden , ale jest trochę pochowany (tak chyba będzie!)
Większość proponowanych funkcji wygląda następująco:
Jednak niektóre znaki z literami nie mieszczą się w BMP (podstawowa płaszczyzna wielojęzyczna, punkty kodowe U + 0 do U + FFFF). Weźmy na przykład następujący tekst:
Pierwszy znak tutaj nie używa wielkich liter, ponieważ indeksowane przez tablicę właściwości ciągów nie mają dostępu do „znaków” ani punktów kodowych *. Dostęp do jednostek kodu UTF-16. Dotyczy to również krojenia - wartości indeksu wskazują jednostki kodu.
Zdarza się, że jednostki kodu UTF-16 to 1: 1 z punktami kodowymi USV w dwóch zakresach, od U + 0 do U + D7FF i U + E000 do U + FFFF włącznie. Większość znaków w skrzynkach należy do tych dwóch zakresów, ale nie wszystkie.
Począwszy od ES2015, radzenie sobie z tym stało się trochę łatwiejsze.
String.prototype[@@iterator]
zwraca ciągi odpowiadające punktom kodowym **. Na przykład możemy to zrobić:W przypadku dłuższych ciągów prawdopodobnie nie jest to strasznie wydajne *** - tak naprawdę nie musimy powtarzać reszty. Moglibyśmy użyć
String.prototype.codePointAt
tej pierwszej (możliwej) litery, ale nadal musielibyśmy ustalić, od czego powinien zacząć się segment. Jednym ze sposobów uniknięcia iteracji reszty byłoby sprawdzenie, czy pierwszy punkt kodowy znajduje się poza BMP; jeśli nie jest, wycinek zaczyna się od 1, a jeśli tak, wycinek zaczyna się od 2.Zamiast tego możesz użyć matematyki bitowej
> 0xFFFF
, ale prawdopodobnie łatwiej jest to zrozumieć i osiągnąć to samo.Możemy również sprawić, aby działało to w ES5 i niższych, jeśli zajdzie taka potrzeba, posuwając się dalej. W ES5 nie ma żadnych wewnętrznych metod pracy z punktami kodowymi, dlatego musimy ręcznie przetestować, czy pierwsza jednostka kodu jest odpowiednikiem ****:
Na początku wspomniałem również o kwestiach dotyczących internacjonalizacji. Niektóre z nich są bardzo trudne do wyjaśnienia, ponieważ wymagają wiedzy nie tylko o tym, jakiego języka używa się, ale mogą również wymagać konkretnej znajomości słów w tym języku. Na przykład irlandzki znak „mb” zaczyna się od wielkiej litery jako „mB” na początku słowa. Kolejny przykład, niemiecki eszett, nigdy nie zaczyna słowa (afaik), ale nadal pomaga zilustrować problem. Małe litery eszett („ß”) są wielkimi literami na „SS”, ale „SS” może składać się z małych liter na „ß” lub „ss” - potrzebujesz znajomości języka niemieckiego poza pasmem, aby wiedzieć, który jest prawidłowy!
Najbardziej znanym przykładem tego rodzaju problemów jest prawdopodobnie turecki. W łacinie tureckiej główną formą i jest İ, natomiast mała litera I to ı - są to dwie różne litery. Na szczęście mamy na to sposób:
W przeglądarce najbardziej preferowany znacznik językowy użytkownika jest oznaczony przez
navigator.language
, lista w kolejności preferencji znajduje się wnavigator.languages
, a język danego elementu DOM można uzyskać (zwykle) za pomocąObject(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
dokumentów wielojęzycznych.W agentach, które obsługują klasy znaków właściwości Unicode w RegExp, które zostały wprowadzone w ES2018, możemy dalej posprzątać, bezpośrednio wyrażając, którymi znakami jesteśmy zainteresowani:
Można to nieco ulepszyć, aby obsługiwać wielkie litery w ciągu z dość dobrą dokładnością. Właściwość znakowa
CWU
lub Changes_When_Uppercased pasuje do wszystkich punktów kodowych, które zmieniają się, gdy są pisane wielkimi literami. Możemy spróbować się z titlecased znaków digraf jak holenderskiego ij na przykład:W momencie pisania (luty 2020) Firefox / Spidermonkey nie wdrożył jeszcze żadnej funkcji RegExp wprowadzonej w ciągu ostatnich dwóch lat *****. Możesz sprawdzić aktualny status tej funkcji w tabeli kompatybilności Kangax . Babel jest w stanie skompilować literały RegExp z odwołaniami do właściwości do równoważnych wzorców bez nich, ale należy pamiętać, że wynikowy kod może być ogromny.
Najprawdopodobniej osoby zadające to pytanie nie będą zajmować się pisaniem wielkich liter ani internacjonalizacją. Ale dobrze jest zdawać sobie sprawę z tych problemów, ponieważ istnieje duża szansa, że w końcu się z nimi spotkasz, nawet jeśli obecnie nie są to obawy. Nie są to przypadki „krawędziowe”, a raczej nie są to przypadki z definicji z definicji - istnieje cały kraj, w którym większość ludzi mówi po turecku, a łączenie jednostek kodowych z punktami kodowymi jest dość powszechnym źródłem błędów (szczególnie z w odniesieniu do emoji). Zarówno łańcuchy, jak i język są dość skomplikowane!
* Jednostki kodowe UTF-16 / UCS2 są również punktami kodowymi Unicode w tym sensie, że np. U + D800 jest technicznie punktem kodowym, ale to nie jest to, co tutaj „znaczy”… tak jakby… chociaż robi się ładnie zamazany. Tym, czym zdecydowanie nie są surogaty, są jednak USV (wartości skalarne Unicode).
** Chociaż jeśli jednostka kodu zastępczego jest „osierocona” - tj. Nie jest częścią logicznej pary - nadal możesz uzyskać tutaj również zastępcze jednostki.
*** może. Nie testowałem tego. Jeśli nie określiłeś, że wielkie litery są znaczącym wąskim gardłem, prawdopodobnie nie przejmowałbym się tym - wybierz wszystko, co Twoim zdaniem jest najbardziej jasne i czytelne.
**** taka funkcja może chcieć przetestować zarówno pierwszą, jak i drugą jednostkę kodu zamiast tylko pierwszej, ponieważ możliwe jest, że pierwsza jednostka jest osieroconym surogatem. Na przykład dane wejściowe „\ uD800x” pisałyby wielką literą X w niezmienionej postaci, czego można oczekiwać lub nie.
***** Oto problem Bugzilli, jeśli chcesz śledzić postępy bardziej bezpośrednio.
źródło
Zawsze lepiej jest najpierw poradzić sobie z tego rodzaju rzeczami za pomocą CSS , ogólnie, jeśli możesz coś rozwiązać za pomocą CSS, najpierw przejdź do tego, a następnie wypróbuj JavaScript, aby rozwiązać problemy, więc w tym przypadku spróbuj użyć
:first-letter
w CSS i zastosujtext-transform:capitalize;
Spróbuj więc stworzyć klasę do tego, abyś mógł z niej korzystać globalnie, na przykład:
.first-letter-uppercase
i dodaj coś takiego jak poniżej w swoim CSS:Alternatywną opcją jest JavaScript, więc najlepiej będzie coś takiego:
i nazwij to tak:
Jeśli chcesz go używać wielokrotnie, lepiej dołącz go do natywnego ciągu javascript, więc coś w stylu poniżej:
i nazwij to jak poniżej:
źródło
Jeśli chcesz sformatować tekst wielkimi literami, możesz zmodyfikować inne przykłady jako takie:
Zapewni to zmianę następującego tekstu:
źródło
źródło
substr
/substring
jest nieco bardziej semantyczny w przeciwieństwie doslice
, ale to tylko kwestia preferencji. Dołączyłem jednak przykłady z ciągami podanymi w pytaniu, co jest miłym akcentem nieobecnym w przykładzie z 09. Szczerze mówiąc, myślę, że sprowadza się to do 15-letniego mnie, który chce karmy na StackOverflow;)Oto funkcja o nazwie ucfirst () (skrót od „wielka pierwsza litera”):
Możesz napisać wielką literą, wywołując ucfirst („jakiś ciąg”) - na przykład
Działa poprzez podział struny na dwie części. W pierwszym wierszu wyciąga firstLetter, a następnie w drugim wierszu kapitalizuje firstLetter , wywołując firstLetter.toUpperCase () i łączy go z resztą ciągu, który można znaleźć, wywołując str.substr (1) .
Możesz pomyśleć, że to nie powiedzie się dla pustego łańcucha, a nawet w języku takim jak C musiałbyś się tym zająć. Jednak w JavaScript, gdy weźmiesz podciąg pustego łańcucha, po prostu odzyskasz pusty łańcuch.
źródło
substr()
jest przestarzałe? To nie jest nawet teraz, trzy lata później, a co dopiero w 2009 roku, kiedy skomentowałeś ten komentarz.substr()
może nie być oznaczony jako przestarzały przez żadną popularną implementację ECMAScript (wątpię, że wkrótce nie zniknie), ale nie jest to część specyfikacji ECMAScript. Trzecie wydanie specyfikacji wspomina o tym w nienormatywnym załączniku, aby „sugerować jednolitą semantykę dla takich właściwości bez włączania właściwości lub ich semantyki do tego standardu”.substring
,substr
islice
) jest zbyt wiele, IMO. Zawsze używam,slice
ponieważ obsługuje ujemne indeksy, nie ma mylących zachowań polegających na zamianie argów, a jego interfejs API jest podobny doslice
innych języków.Stosowanie:
To jest ciąg tekstowy => To jest ciąg tekstowy
źródło
return.this.toLocaleLowerCase().replace(
...String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); };
Trochę zmieniam kod, potrzebujesz tylko pierwszego dopasowania.źródło
Sprawdź to rozwiązanie:
źródło
stringVal.replace(/^./, stringVal[0].toUpperCase());
stringVal[0]
byłobyundefined
pustestringVal
, i jako taka próba dostępu do nieruchomości.toUpperCase()
spowodowałaby błąd.(Możesz obudować go funkcją lub nawet dodać do prototypu String, jeśli często go używasz.)
źródło
ucfirst
Funkcja działa, jeśli robisz to w ten sposób.Dzięki JP za deklarację.
źródło
string[0].toUpperCase() + string.substring(1)
(string[0] || '').toUpperCase() + string.substring(1)
(string[0] || '')
możesz po prostustring.charAt(0)
.Możesz to zrobić w jednym wierszu takim jak ten
źródło
Ta funkcja strzałki była dla mnie najłatwiejsza. Zamień dopasowuje pierwszą literę (
\w
) łańcucha i konwertuje ją na wielkie litery. Nie potrzeba nic bardziej wymyślnego.źródło
/./
z dwóch powodów:/\w/
pominie wszystkie poprzednie znaki