Ich verstehe, warum die gewünschte Ausgabe nicht für die Konvertierung mit Regex einer Zeichenfolge angegeben wird, wie FooBar
sie Foo_Bar
stattdessen angegeben wird Foo_Bar_
. Ich hätte etwas mit String.substring machen substring(0, string.length() - 2)
oder einfach das letzte Zeichen ersetzen können, aber ich denke, es gibt eine bessere Lösung für ein solches Szenario.
Hier ist der Code:
String regex = "([A-Z][a-z]+)";
String replacement = "$1_";
"CamelCaseToSomethingElse".replaceAll(regex, replacement);
/*
outputs: Camel_Case_To_Something_Else_
desired output: Camel_Case_To_Something_Else
*/
Frage: Suchen Sie nach einem besseren Weg, um die gewünschte Ausgabe zu erzielen?
Antworten:
Siehe diese Frage und
CaseFormat
von Guavein Ihrem Fall so etwas wie:
quelle
Binden Sie die Klein- und Großbuchstaben als zwei Gruppen, es wird in Ordnung sein
quelle
IBMIsMyCompany
. B.: .Sie können das folgende Code-Snippet verwenden:
quelle
MyUUID
richtig zu unterstreichen, ich habemy_uu_id
.Ich kann RegEx nicht bereitstellen, es wäre sowieso wahnsinnig komplex.
Probieren Sie diese Funktion mit automatischer Erkennung von Akronymen aus.
Leider erkennt Guava lib Akronyme in Großbuchstaben nicht automatisch, sodass "bigCAT" in "BIG_C_A_T" konvertiert wird.
quelle
Warum nicht einfach das vorherige Zeichen als nicht Zeilenanfang
$
abgleichen?Beachten Sie, dass diese Version sicher für etwas ausgeführt werden kann, das bereits in Kamelhülle ist.
quelle
^
und$
als Anker zu verwenden? Weil sich ihre Bedeutung ändert, wenn Sie sie in eine Charakterklasse einordnen.[^$_A-Z]
passt zu jedem Zeichen, das nicht$
ist_
, oder zu einem Großbuchstaben, und ich glaube nicht, dass Sie das gemeint haben.$
wurde fälschlicherweise hinzugefügt, da es sich um eine Technik handelt, die ich für Klassennamen verwende.Fügen Sie eine Lookahead-Zusicherung mit einer Breite von Null hinzu.
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
Lesen Sie die Dokumentation für
(?=X)
etc.Persönlich würde ich die Zeichenfolge tatsächlich teilen und dann neu kombinieren. Dies kann sogar schneller sein, wenn es richtig gemacht wird, und es macht den Code viel einfacher zu verstehen als Magie mit regulären Ausdrücken. Versteh mich nicht falsch: Ich liebe reguläre Ausdrücke. Aber das ist nicht wirklich ein ordentlicher regulären Ausdruck, noch ist diese Transformation eine klassische regexp Aufgabe. Immerhin scheint es, dass Sie auch Kleinbuchstaben machen wollen?
Ein hässlicher , aber schneller Hack wäre zu ersetzen
(.)([A-Z]+)
mit$1_$2
und dann danach die gesamte Zeichenfolge in Kleinbuchstabe (es sei denn , Sie Perl-Stil verlängerten regexps tun können, in dem Sie den Ersatz direkt in Kleinbuchstabe können!). Trotzdem denke ich darüber nach, beim Übergang von unten nach oben zu teilen, dann zu transformieren und dann zu verbinden, um dies richtig und am besten lesbar zu machen.quelle
[A-Z][a-z]*
, den ersten Buchstaben in Kleinbuchstaben schreiben und sie wieder zusammenfügen. Oder der Ersatz + Kleinbuchstaben-Trick, den ich gerade zur Hauptantwort hinzugefügt habe.quelle
Ich bin mir nicht sicher, ob es möglich ist, mit reinem Regex etwas wirklich Solides zu haben. Besonders um Akronyme zu unterstützen.
Ich habe eine kleine Funktion erstellt, die von der Antwort von @radzimir inspiriert ist und Akronyme und kein alphabetisches Zeichen unterstützt:
Von https://gist.github.com/ebuildy/cf46a09b1ac43eea17c7621b7617ebcd :
quelle
Sollte nach einem Großbuchstaben suchen, gefolgt von Kleinbuchstaben. Der positive Lookahead sucht nach einem anderen Wort, das mit einem Großbuchstaben gefolgt von Kleinbuchstaben beginnt, schließt es jedoch NICHT in das Match ein.
Schauen Sie hier: http://regexr.com?30ooo
quelle
Ich musste dies implementieren, um einige Schlüssel im Kamelbuchstabenformat in Kleinbuchstaben mit Unterstrichen umzuwandeln. Der reguläre Ausdruck, den ich mir ausgedacht habe, ist:
(?<!^|_|[A-Z])([A-Z])
Im Englischen steht es für Großbuchstaben, denen nicht der Anfang der Zeichenfolge, ein Unterstrich oder ein anderer Großbuchstabe vorangestellt ist .
In den folgenden Beispielen sind die fett gedruckten Zeichen diejenigen, die mit dem oben genannten regulären Ausdruck eine Übereinstimmung erzeugen sollen:
Beachten Sie, dass der Ausdruck keine Zeichenfolge beeinflusst, die bereits in Kleinbuchstaben + Unterstrich vorliegt.
Das Ersatzmuster wäre:
_l$1
Dies bedeutet Kleinbuchstaben der ersten Erfassungsgruppe , wobei die erste Erfassungsgruppe der Großbuchstabe ist. Sie können anschließend auch die gesamte Zeichenfolge in Kleinbuchstaben schreiben, um die letzten beiden Samples aus der obigen Liste zu normalisieren.
quelle