Chciałbym napisać metodę, która konwertuje CamelCase na nazwę czytelną dla człowieka.
Oto przypadek testowy:
public void testSplitCamelCase() {
assertEquals("lowercase", splitCamelCase("lowercase"));
assertEquals("Class", splitCamelCase("Class"));
assertEquals("My Class", splitCamelCase("MyClass"));
assertEquals("HTML", splitCamelCase("HTML"));
assertEquals("PDF Loader", splitCamelCase("PDFLoader"));
assertEquals("A String", splitCamelCase("AString"));
assertEquals("Simple XML Parser", splitCamelCase("SimpleXMLParser"));
assertEquals("GL 11 Version", splitCamelCase("GL11Version"));
}
PDFLoader
stajePDF Loader
?Odpowiedzi:
Działa to z twoimi przypadkami testowymi:
Oto uprząż testowa:
Używa dopasowania wyrażenia regularnego o zerowej długości z lookbehind i lookforward, aby znaleźć miejsce na wstawienie spacji. Zasadniczo istnieją 3 wzory i używam
String.format
ich do połączenia, aby było bardziej czytelne.Te trzy wzory to:
UC za mną, UC i LC przed mną
non-UC za mną, UC przede mną
List za mną, nie list przede mną
Bibliografia
Powiązane pytania
Używanie lookarounds dopasowania o zerowej długości do podziału:
źródło
%s
” to symbole zastępczeString.format(String format, args...)
argumentów. Możesz również zadzwonić według indeksu:String.format("%$1s|%$2s|%$3s", ...
relaceAll
też, chcę dodać podział, jeśli łańcuch zawiera ".
".Możesz to zrobić za pomocą
org.apache.commons.lang.StringUtils
źródło
Zgrabne i krótsze rozwiązanie:
źródło
assert
z pytań, kapitalizacja nie jest pożądana.Jeśli nie lubisz „skomplikowanych” wyrażeń regularnych i wcale nie przejmujesz się wydajnością, skorzystałem z tego przykładu, aby osiągnąć ten sam efekt w trzech etapach.
Przechodzi pomyślnie wszystkie powyższe przypadki testowe, w tym te z cyframi.
Jak mówiłem, nie jest to tak dobre, jak użycie jednego wyrażenia regularnego w innych przykładach tutaj - ale ktoś może uznać to za przydatne.
ź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
Następujący Regex może służyć do identyfikacji wielkich liter w wyrazach wewnętrznych:
Dopasowuje każdą wielką literę, czyli eter po innej niż wielka literze lub cyfrze lub po której następuje mała litera i każda cyfra po literze.
Jak wstawić spację przed nimi, wykracza poza moje umiejętności Java =)
Edytowano, aby uwzględnić wielkość liter i przypadek modułu ładującego PDF.
źródło
L
sięPDFLoader
?|
jako „lub”. Cóż ... może to ... Widziałem gorzej = /Myślę, że będziesz musiał iterować po ciągu i wykrywać zmiany z małych na wielkie, z wielkich na małe, alfabetyczne na numeryczne, numeryczne na alfabetyczne. Przy każdej wykrytej zmianie wstaw spację z jednym wyjątkiem: przy zmianie z wielkich na małe litery wstawiasz spację o jeden znak przed.
źródło
Działa to w .NET ... optymalizuj według własnych upodobań. Dodałem komentarze, abyś mógł zrozumieć, co robi każdy kawałek. (RegEx może być trudny do zrozumienia)
źródło
Dla przypomnienia, oto prawie (*) kompatybilna wersja Scala:
Po skompilowaniu może być używany bezpośrednio z Javy, jeśli odpowiednia biblioteka scala.jar znajduje się w ścieżce klas.
(*) kończy się niepowodzeniem dla danych wejściowych,
"GL11Version"
dla których zwraca"G L11 Version"
.źródło
Wziąłem Regex z polygenelubricants i przekształciłem go w metodę rozszerzającą na obiektach:
To zmienia wszystko w czytelne zdanie. Wykonuje ToString na przekazanym obiekcie. Następnie używa Regex podanego przez polygenelubricants, aby podzielić ciąg. Następnie To Obniża każde słowo z wyjątkiem pierwszego słowa i wszelkich akronimów. Pomyślałem, że to może być przydatne dla kogoś tam.
źródło
Nie jestem ninja wyrażeń regularnych, więc iterowałem po ciągu, zachowując indeksy bieżącej sprawdzanej pozycji i poprzedniej pozycji. Jeśli bieżąca pozycja jest wielką literą, wstawiłbym spację po poprzedniej pozycji i zwiększyłby każdy indeks.
źródło
http://code.google.com/p/inflection-js/
Możesz połączyć w łańcuch metody String.underscore (). Humanize () , aby pobrać ciąg CamelCase i przekształcić go w ciąg czytelny dla człowieka.
źródło