Jak mogę przekształcić ciąg znaków w skrzynkę wielbłąda za pomocą wyrażenia regularnego javascript?
EquipmentClass name
lub
Equipment className
lub equipment class name
lubEquipment Class Name
powinny stać się: equipmentClassName
.
javascript
regex
camelcasing
Scott Klarenbach
źródło
źródło
Odpowiedzi:
Patrząc na swój kod, możesz to osiągnąć za pomocą tylko dwóch
replace
wywołań:Edycja: Lub za pomocą jednego
replace
połączenia, przechwytując białe spacje również wRegExp
.źródło
camelize("Let's Do It!") === "let'SDoIt!"
smutna twarz . Spróbuję sam, ale obawiam się, że dodam kolejny zamiennik.return this.replace(/[^a-z ]/ig, '').replace(/(?:^\w|[A-Z]|\b\w|\s+)/g,
...const toCamelCase = (str) => str.replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, '');
.toLowerCase()
metodę w łańcuch . Np. używając rozwiązania @ tabrindle powyżej:const toCamelCase = (str) => str.toLowerCase().replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, '');
Jeśli ktoś używa lodash , jest
_.camelCase()
funkcja.źródło
Skończyło się na tym:
Próbowałem uniknąć łączenia w łańcuch wielu instrukcji zamiany. Coś, gdzie w mojej funkcji miałbym 1 $, 2 $, 3 $. Ale ten typ grupowania jest trudny do zrozumienia, a twoja wzmianka o problemach z różnymi przeglądarkami jest czymś, o czym nigdy też nie myślałem.
źródło
this.valueOf()
zamiast zdawaćstr
. Alternatywnie (tak jak w moim przypadku),this.toLowerCase()
ponieważ moje ciągi wejściowe były zapisane WIELKIMI LITERAMI, które nie miały odpowiednio zmniejszonych części bez garbu. Użycie po prostuthis
zwraca sam obiekt string, który w rzeczywistości jest tablicą znaków, stąd wspomniany powyżej błąd TypeError.Możesz skorzystać z tego rozwiązania:
źródło
toCamelCase
funkcja po prostu to robi.ES5
ES6
Uwaga:
dla tych języków z akcentami. Dołącz
À-ÖØ-öø-ÿ
do wyrażenia regularnego w następujący sposób.replace(/[^a-zA-ZÀ-ÖØ-öø-ÿ0-9]+(.)/g
źródło
https://stackoverflow.com/posts/52551910/revisions
ES6, nie testowałem tego. Sprawdzę i zaktualizuję.W konkretnym przypadku Scotta wybrałbym coś takiego:
Wyrażenie regularne dopasuje pierwszy znak, jeśli zaczyna się wielką literą i dowolnym znakiem alfabetu występującym po spacji, tj. 2 lub 3 razy w określonych ciągach.
/^([A-Z])|[\s-_](\w)/g
Doprawienie wyrażenia regularnego spowoduje również kamelizację nazw typów łączników i podkreślników.źródło
+
) do grupy znaków, tj .:/^([A-Z])|[\s-_]+(\w)/g
Próbowałem znaleźć funkcję JavaScript
camelCase
w łańcuchu i chciałem się upewnić, że znaki specjalne zostaną usunięte (i miałem problem ze zrozumieniem, co robią niektóre z powyższych odpowiedzi). Jest to oparte na odpowiedzi cc young, z dodanymi komentarzami i usunięciem znaków $ peci & l.źródło
Niezawodny, działający przykład, z którego korzystam od lat:
Znaki zmieniające wielkość liter:
-
_
.
źródło
Jeśli regexp nie jest wymagane, możesz spojrzeć na następujący kod, który stworzyłem dawno temu dla Twinkle :
Nie wykonałem żadnych testów wydajności, a wersje regexp mogą być szybsze lub nie.
źródło
Moje podejście do ES6 :
źródło
źródło
lodash może załatwić sprawę pewnie i dobrze:
Chociaż
lodash
może to być „duża” biblioteka (~ 4kB), zawiera ona wiele funkcji, do których normalnie używałbyś fragmentu kodu lub tworzyłbyś go samodzielnie.źródło
Oto jeden liner wykonujący pracę:
Dzieli ciąg z małymi literami na podstawie listy znaków podanej w wyrażeniu regularnym
[.\-_\s]
(dodaj więcej wewnątrz []!) I zwraca tablicę słów. Następnie redukuje tablicę ciągów do jednego połączonego ciągu słów z dużymi pierwszymi literami. Ponieważ redukcja nie ma wartości początkowej, rozpocznie wielkie litery, zaczynając od drugiego słowa.Jeśli chcesz PascalCase, po prostu dodaj początkowy pusty ciąg
,'')
do metody redukującej.źródło
podążając za czytelnym podejściem @ Scotta, trochę dopracowania
źródło
trochę zmodyfikowana odpowiedź Scotta:
teraz zastępuje również „-” i „_”.
źródło
Wszystkie 14 permutacji poniżej daje ten sam wynik „equipmentClassName”.
źródło
możesz skorzystać z tego rozwiązania:
źródło
Ponieważ to pytanie wymagało jeszcze jednej odpowiedzi ...
Wypróbowałem kilka poprzednich rozwiązań i wszystkie miały tę czy inną wadę. Niektórzy nie usunęli interpunkcji; niektórzy nie zajmowali się sprawami z liczbami; niektóre nie obsługiwały wielu znaków interpunkcyjnych z rzędu.
Żaden z nich nie radził sobie ze sznurkiem jak
a1 2b
. Nie ma wyraźnie zdefiniowanej konwencji dla tego przypadku, ale niektóre inne pytania dotyczące przepełnienia stosu sugerowały oddzielenie liczb za pomocą podkreślenia.Wątpię, czy jest to najbardziej wydajna odpowiedź (trzy wyrażenia regularne przechodzą przez ciąg zamiast jednego lub dwóch), ale przechodzi wszystkie testy, jakie przychodzą mi do głowy. Szczerze mówiąc, naprawdę nie mogę sobie wyobrazić przypadku, w którym robisz tyle konwersji na wielbłądzie, że wydajność miałaby znaczenie.
(Dodałem to jako pakiet npm . Zawiera również opcjonalny parametr boolean, aby zwrócić Pascal Case zamiast Camel Case.)
Przypadki testowe (Jest)
źródło
Oto moje rozwiązanie:
źródło
Ta metoda wydaje się być lepsza od większości odpowiedzi tutaj, jest jednak trochę zepsuta, bez zastępowania, bez wyrażenia regularnego, po prostu tworzy nowy ciąg, który jest camelCase.
źródło
Opiera się to na odpowiedzi przekazanej przez CMS, usuwając wszelkie znaki niealfabetyczne, w tym podkreślenia, co
\w
nie powoduje usunięcia.źródło
Wielkie litery wielbłąda („TestString”) do małych liter wielbłąda („testString”) bez użycia wyrażenia regularnego (spójrzmy prawdzie w oczy, wyrażenie regularne jest złe):
źródło
Skończyło się na stworzeniu nieco bardziej agresywnego rozwiązania:
Ten, powyżej, usunie wszystkie znaki niealfanumeryczne i małe litery słów, które w przeciwnym razie pozostałyby wielkimi literami, np.
Size (comparative)
=>sizeComparative
GDP (official exchange rate)
=>gdpOfficialExchangeRate
hello
=>hello
źródło
źródło
Oto moja sugestia:
lub
Przypadki testowe:
źródło
Wiem, że to stara odpowiedź, ale obsługuje zarówno białe znaki, jak i _ (lodash)
źródło
"
w.replace(/_/g", " ")
że błędy przyczyny kompilacji?źródło
EDYCJA : Teraz działa w IE8 bez zmian.
EDYCJA : Byłem w mniejszości, jeśli chodzi o to, czym właściwie jest camelCase (wiodące małe litery vs. wielkie). Społeczność uważa, że wiodącą małą literą jest wielbłąd, a wiodącą wielką literą jest paskal. Stworzyłem dwie funkcje, które używają tylko wzorców regex. :) Używamy więc ujednoliconego słownictwa. Zmieniłem swoje stanowisko, aby dopasować się do większości.
Uważam, że potrzebujesz tylko jednego wyrażenia regularnego w obu przypadkach:
lub
W funkcjach: Zauważysz, że w tych funkcjach zamiana polega na zamianie dowolnego znaku innego niż az spacją na pusty ciąg. Ma to na celu utworzenie granic słów dla wielkich liter. „hello-MY # world” -> „HelloMyWorld”
Uwagi:
Cieszyć się
źródło
Myślę, że to powinno działać ..
źródło
Nie używaj String.prototype.toCamelCase (), ponieważ String.prototypes są tylko do odczytu, większość kompilatorów js wyświetli to ostrzeżenie.
Podobnie jak ja, ci, którzy wiedzą, że ciąg zawsze będzie zawierał tylko jedną spację, mogą zastosować prostsze podejście:
Miłego dnia. :)
źródło