Czy istnieje prosty sposób konwersji ciągu na wielkość liter? Na przykładjohn smith
John Smith
. Staje się . Nie szukam czegoś skomplikowanego jak rozwiązanie Johna Resiga , tylko (mam nadzieję) jakiś jedno- lub dwuwarstwowy .
javascript
title-case
MDCore
źródło
źródło
Odpowiedzi:
Spróbuj tego:
źródło
\w\S*
jest używany zamiast\w+
lub\w*
na przykład? Nie wiem, dlaczego chcesz wstawić tylko spacje i dlatego zmienić Jim-Bob na Jim-bob .\w\S*
również spowodowałJim-bob
problem z naszej strony. Korzystanie\w*
rozwiązało to./([^\W_]+[^\s-]*) */g
rozwiązujeJim-Bob
problem, tj .:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
jest twoje pragnienie, prawdopodobnie powinieneś to zrobić/\b\w+/g
. Przykład:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
jest używane zamiast\w+
lub w\w*
taki sposób, że słowa takieDon't
nie są modyfikowaneDon'T
, ale jak zauważyli inni,\w\S*
powodują problemy ze słowami dzielonymi.Nieco bardziej elegancki sposób, dostosowujący funkcję Grega Deana:
Nazwij to tak:
źródło
Jo-Ann Smith
ten kod będzie przekonwertować je naJo-ann Smith
(uwaga na małe literya
wAnn
).Spróbuj zastosować styl CSS z transformacją tekstu do swoich kontrolek.
na przykład:
(text-transform: capitalize);
Stosuj podejście JS tylko wtedy, gdy jest to absolutnie konieczne.
źródło
Oto moja wersja, IMO jest łatwa do zrozumienia i elegancka.
źródło
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Nazwy takie jak „McDonald” lub akronimy takie jak „ASAP” powinny zachować swoje wielkie litery. Jeśli ktoś faktycznie przekazał ciąg taki jak „heLLO”, aplikacja nie powinna zakładać, że wielkie litery są niepoprawne.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
jest to jedna postać.Oto moja funkcja, która konwertuje na wielkość liter, ale zachowuje również zdefiniowane akronimy jako wielkie litery, a małe słowa jako małe:
Na przykład:
źródło
/\w\S*/g
na/([^\W_]+[^\s-]*) */g
na komentarz powyżej @ awashburn, aby rozwiązać ten problem./\b\w+/g
, jaką można uzyskać, stosując wzorzec wyrażenia regularnego , który wydaje mi się szybszy do zrozumienia?/([^\W_]+[^\s-]*) */g
na/\b\w+/g
na komentarz per @ Michael; prosimy o komentarz, jeśli znajdziesz przypadek, w którym konieczne jest zastosowanie bardziej skomplikowanego wyrażenia regularnego./\b[\w-\']+/g
, aby umożliwić łączenie wyrazów i apostrof w słowach.Wolę poniższe niż inne odpowiedzi. Dopasowuje tylko pierwszą literę każdego słowa i dodaje wielkie litery. Prostszy kod, łatwiejszy do odczytania i mniej bajtów. Zachowuje istniejące duże litery, aby zapobiec zniekształcaniu akronimów. Jednak zawsze możesz najpierw wywołać
toLowerCase()
swój ciąg.Możesz dodać to do swojego prototypu ciągu, co pozwoli ci
'my string'.toTitle()
w następujący sposób:Przykład:
Pokaż fragment kodu
źródło
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Pamiętaj tylko, że złamałoby to akronimy.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
) jest bardziej elastyczna / użyteczna niż ta, która zakłada intencje programistów. Ta metoda odzwierciedla również funkcjonalność podobnych wbudowanych metod innych języków, takich jak PHP (ucwords
) i Golang (strings.Title
). .NET (TextInfo.ToTitleCase
) ciekawie działa w przypadku małych i wielkich liter, ale pozostawiłby również w pełni niezmienione wielkie litery.Bez użycia wyrażenia regularnego wyłącznie w celach informacyjnych:
źródło
źródło
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
Znowu, to działa tylko na wielkie litery pierwszej litery, ale w przypadku, gdy tego potrzebujesz, moja konstrukcja działa.'$1'.toUpperCase()
, wydaje się, że wielkie litery nie zostały wykonane przed przypisaniem wartości.'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Możesz od razu
toLowerCase
ciąg, a następnie tylkotoUpperCase
pierwszą literę każdego słowa. Staje się bardzo prostym 1 linijką:źródło
s => s.toUpperCase()
). Moim wariantem jest robienie tego, co zrobiłeś, ale rozszerzanie obiektu String (jakkolwiek kontrowersyjnego):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
polega natywna funkcja strzałki (ES6), link przeskakuje do nich w Dokumentach Mozillla, które również zapewniają tabelę wsparcia.Na wszelki wypadek, gdy martwisz się wypełniającymi słowami, zawsze możesz po prostu powiedzieć tej funkcji, czego nie należy pisać dużymi literami.
Mam nadzieję, że to ci pomoże.
edytować
Jeśli chcesz obsługiwać wiodące słowa kleju, możesz śledzić tę w / jeszcze jedną zmienną:
źródło
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
staje sięand Another Thing
. Potrzebujesz tylko eleganckiego sposobu, aby zawsze używać pierwszego słowa.Jeśli regex użyty w powyższych rozwiązaniach powoduje dezorientację, wypróbuj ten kod:
źródło
split
ma przekształcić go do tablicy, po prostu nie widzę go jako oczywisty, ponieważmap
oznacza, że nie trzeba używać[]
notacjiStworzyłem tę funkcję, która może obsługiwać nazwiska (więc nie jest to przypadek tytułu), takie jak „McDonald” lub „MacDonald” lub „O'Toole” lub „D'Orazio”. Nie obsługuje jednak niemieckich ani holenderskich nazw z „van” lub „von”, które są często pisane małymi literami ... Wierzę, że „de” jest często małymi literami, np. „Robert de Niro”. Trzeba je jeszcze rozwiązać.
źródło
macy
problem, umieszczając w nim negatywne spojrzenie, tak więc\b((m)(a?c))?(\w)
staje się\b((m)(a?c))?(\w)(?!\s)
Wydaje się, że działa ... Testowany z powyższym, „szybkobrązowy, lis? / Skacze / ^ ponad ^ leniwy! Pies ...” i „C: / pliki programów / jakiś dostawca / ich 2. aplikacja / a plik1.txt ”.
Jeśli chcesz 2Nd zamiast 2, możesz zmienić na
/([a-z])(\w*)/g
.Pierwszy formularz można uprościć jako:
źródło
Spróbuj tego
Przykład
źródło
Jeśli możesz używać bibliotek stron trzecich w swoim kodzie, lodash ma dla nas funkcję pomocniczą.
https://lodash.com/docs/4.17.3#startCase
źródło
Wypróbuj tę najkrótszą drogę:
źródło
ES 6
jeszcze
źródło
s.slice(0, 1).toUpperCase()
jeśli nadal chcesz ten pierwszy list.str
.charAt(0).toUpperCase()
.Większość z tych odpowiedzi wydaje się ignorować możliwość użycia słowa metaznak granicy (\ b). Krótsza wersja wykorzystującej ją odpowiedzi Grega Deana:
Działa z nazwami dzielonymi, takimi jak Jim-Bob.
źródło
\w
zawiera tylko znaki[A-Za-z0-9_]
, a nie wszystkie litery. W tym celu musisz użyć kategorii Unicode\p{L}
. Będziesz potrzebował/u
modyfikatora (patrz tutaj ) i innego rozwiązania dla\b
, które działa tylko pomiędzy\W
i\w
(patrz tutaj )Myślę, że najprostszym jest użycie css.
źródło
Służy
/\S+/g
do wspierania znaków diakrytycznych:Jednak: „ s unshine ( y ellow)” ⇒ „ S unshine ( y ellow)”
źródło
Chciałem dodać własną odpowiedź, ponieważ potrzebowałem solidnej
toTitleCase
funkcji, która uwzględnia wymienione tutaj reguły gramatyczne (artykuł polecany przez Google). Istnieją różne reguły, które zależą od długości ciągu wejściowego. Poniżej znajduje się funkcja + testy jednostkowe.Ta funkcja również konsoliduje białe znaki i usuwa znaki specjalne (zmodyfikuj wyrażenie regularne według swoich potrzeb)
Funkcja toTitleCase
Testy jednostkowe w celu zapewnienia poprawności
Pamiętaj, że usuwam sporo znaków specjalnych z podanych ciągów znaków. Konieczne będzie poprawienie wyrażenia regularnego w celu spełnienia wymagań Twojego projektu.
źródło
źródło
o'henry
robi dziwne rzeczyhorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
lepsze 🤔\b
i\S
są specjalnymi klasami znaków oznaczającymi „granicę słów” i „pojedynczy znak spacji. Tak więc wyrażenie regularne dopasowuje każdy znak następujący po granicy słowa i dodaje ten znak wielką literą, stosując daną funkcję strzałki.Korzystając z rozwiązania „lewax00”, stworzyłem to proste rozwiązanie, które wymusza „w” zaczynając od spacji lub „w”, które inicjują de słowo, ale nie jest w stanie usunąć dodatkowych spacji pośrednich.
Rezultatem jest „Sofía Vergara”.
źródło
Oto moja funkcja, która zajmuje się akcentowanymi znakami (ważnymi dla francuskiego!) I która może włączać / wyłączać obsługę niższych wyjątków. Mam nadzieję, że to pomaga.
źródło
Rozmawialiśmy tutaj, w biurze, i uważamy, że próba automatycznego poprawienia sposobu wprowadzania nazwisk w sposób, w jaki chcesz, jest obarczony potencjalnymi problemami.
Wymyśliliśmy kilka przypadków, w których różne rodzaje automatycznych wielkich liter rozpadają się i są one tylko dla angielskich nazw, każdy język ma swoją złożoność.
Problemy z pisaniem wielką literą każdej nazwy:
• Wprowadzanie akronimów takich jak IBM nie jest dozwolone, zmienia się w Ibm.
• Nazwa McDonald zmieni się w Mcdonald, co jest niepoprawne, to samo dotyczy MacDonald.
• Podwójnie nazwane nazwiska, takie jak Marie-Tonks, zamieniłyby się w Marie-tonks.
• Nazwy takie jak O'Connor zamieniłyby się w O'connor.
W przypadku większości z nich można napisać niestandardowe reguły, aby sobie z tym poradzić, jednak nadal występują problemy z akronimami, tak jak poprzednio, i pojawia się nowy problem:
• Dodanie reguły naprawy nazw w komputerach Mac, takich jak MacDonald, spowodowałoby, że nazwy przerwania, takie jak Macy, zamieniłyby je w MacY.
Jedynym wymyślonym przez nas rozwiązaniem, które nigdy nie jest niepoprawne, jest pisanie wielkimi literami, co jest metodą brutalnej siły, której wydaje się używać również DBS.
Więc jeśli chcesz zautomatyzować ten proces, najlepiej jest obejść się bez słownika dla każdej pojedynczej nazwy i słowa oraz tego, jak należy go używać wielkich liter. Jeśli nie masz reguły obejmującej wszystko, nie używaj jej w ten sposób po prostu zirytuje użytkowników i zachęci osoby, które chcą poprawnie wpisać swoje nazwisko, aby pójść gdzie indziej.
źródło
oto inne rozwiązanie za pomocą css (i javascript, jeśli tekst, który chcesz przekształcić, jest pisany wielkimi literami):
HTML
js
css
źródło
Dla tych z nas, którzy boją się wyrażeń regularnych (lol):
źródło
Moje jedno liniowe rozwiązanie:
Następnie możesz wywołać metodę
capitalizeWords()
na dowolnym ciągu. Na przykład:Moje inne rozwiązanie:
Następnie możesz wywołać metodę
capitalizeWords()
na dowolnym ciągu. Na przykład:Alternatywne rozwiązanie oparte na odpowiedzi Grega Deana:
Następnie możesz wywołać metodę
capitalizeWords()
na dowolnym ciągu. Na przykład:źródło
Zaskoczony, gdy nikt nie wspomniał o użyciu parametru rest. Oto prosty jednowarstwowy, który wykorzystuje parametry ES6 Rest.
źródło
Jest to oparte na moim rozwiązaniu FreeFodeCamp's Bonfire „Title Case” , które wymaga, aby najpierw przekonwertować podany ciąg znaków na wszystkie małe litery, a następnie przekonwertować każdą postać poprzedzającą spację na wielkie litery.
Bez użycia wyrażenia regularnego:
źródło