Tytuł mówi wszystko. Jaki jest najprostszy / najbardziej elegancki sposób, w jaki mogę przekonwertować w Javie ciąg znaków z formatu "THIS_IS_AN_EXAMPLE_STRING"
na format „ ThisIsAnExampleString
”? Wydaje mi się, że musi istnieć co najmniej jeden sposób, aby to zrobić, używając String.replaceAll()
i wyrażenia regularnego.
Moje wstępne przemyślenia są następujące: _
dodaj znak podkreślenia ( ) na początku, zamień cały ciąg na małe litery, a następnie użyj funkcji replaceAll do konwersji każdego znaku poprzedzonego podkreśleniem z jego wersją wielką.
Odpowiedzi:
Inną opcją jest użycie Google Guava
com.google.common.base.CaseFormat
George Hawkins zostawił komentarz z tym przykładem użycia:
źródło
Spójrz na WordUtils w bibliotece języków Apache Commons :
W szczególności metoda capitalizeFully (String str, char [] delimiters) powinna wykonać zadanie:
Zielony pasek!
źródło
Uwaga : musisz dodać walidację argumentów.
źródło
String result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "THIS_IS_AN_EXAMPLE_STRING");
. Zobacz com.google.common.base.CaseFormat javadoc .Z Apache Commons Lang3 lib jest to bardzo proste.
Przykład:
Daje:
źródło
źródło
Oto fragment kodu, który może pomóc:
źródło
Przykład języka Java 1.8 przy użyciu strumieni
THIS_IS_SOME_TEXT jest teraz thisIsSomeText
źródło
text.matches( "([a-z]+[a-zA-Z0-9]+)+" )
przed osłoną wielbłąda jest prawdopodobnie rozsądnym obejściem problemu z dolną osłoną.Nie jestem pewien, ale myślę, że mogę zużywać mniej pamięci i uzyskać niezawodną wydajność, robiąc to znak po znaku. Robiłem coś podobnego, ale w pętlach w wątkach w tle, więc na razie próbuję. Miałem pewne doświadczenia z tym, że String.split był droższy niż oczekiwano. Pracuję na Androidzie i spodziewam się, że czkawka GC będzie większym problemem niż użycie procesora.
Wskazówka, że String.split jest kosztowna, polega na tym, że jego wejście jest wyrażeniem regularnym (a nie char, jak String.indexOf) i zwraca tablicę (zamiast powiedzieć iterator, ponieważ pętla używa tylko jednej rzeczy naraz). Plus przypadki, takie jak „AB_AB_AB_AB_AB_AB ...” zmniejszają wydajność dowolnej kopii zbiorczej, aw przypadku długich ciągów wykorzystują o rząd wielkości więcej pamięci niż ciąg wejściowy.
Podczas gdy pętla przez znaki nie ma przypadku kanonicznego. Więc dla mnie narzut niepotrzebnego wyrażenia regularnego i tablicy wydaje się generalnie mniej korzystny (rezygnacja z możliwej wydajności masowego kopiowania). Zainteresowany opiniami / poprawkami, dzięki.
źródło
Czasy: w milisekundach.
źródło
Możesz użyć org.modeshape.common.text.Inflector .
Konkretnie:
Artefakt Mavena to: org.modeshape: modeshape-common: 2.3.0
w repozytorium JBoss: https://repository.jboss.org/nexus/content/repositories/releases
Oto plik JAR: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar
źródło
Możesz także spróbować:
źródło
źródło
Jest to najprostszy program do konwersji na CamelCase. mam nadzieję, że ci to pomoże ...
źródło
Przekształci się
Enum Constant
w Camel Case. Byłoby pomocne dla każdego, kto szuka takiej funkcjonalności.źródło
Jeszcze jedno rozwiązanie tego problemu może wyglądać następująco.
źródło
Wywołanie jako
Czas wykonania: 14 ms
źródło
Prosty snnipet:
źródło
Java 8 dla wielu ciągów:
źródło
źródło
CaseFormat
nie jest standardowym interfejsem API. Zduplikowana odpowiedź, jeśli to guawa.