2017-03-11 5 views
0

Was wäre ein richtiger Weg - Best Practice - ein Wort (Zeichenfolge) in einem String durch einen anderen zu ersetzen und dennoch den Fall des Originals beizubehalten? Insbesondere wenn das Original nur aus Großbuchstaben besteht, sollte das Ersatzwort genauso gut sein. Wenn das Original nur aus Kleinbuchstaben besteht, sollte auch das Ersatzwort verwendet werden. Wenn das Original mit einem Großbuchstaben beginnt und der Rest Kleinbuchstaben ist, sollte auch das Ersatzwort verwendet werden.Ersetzen eines Worts in einer Zeichenfolge unter Beibehaltung des Originalworts

Ich derzeit implementieren dies mit drei bedingten Prüfungen, die für meine Zwecke gut funktioniert. Aber es scheint mir, dass es einen besseren "Best Practice" Weg geben muss, möglicherweise, aber nicht notwendigerweise, mit Regex. Dies soll eine Diskussion über mögliche Best- oder Best Practice zur Erschließung bestehender Best Practices sein, nicht eine Aufforderung zur Lösung eines trivialen Coding-Problems, das bereits gelöst und implementiert ist.

Ein konkretes Beispiel. In einer Anwendung, die auf mehreren Plattformen ausgeführt werden kann, werden alle Zeichenfolgen, die "Klicken" enthalten, in "Tippen" übersetzt, wenn sie auf einem mobilen Gerät ausgeführt werden, während "Klicken" zu "Tippen" wird und "KLICKEN" zu "TAP" wird. In meinem Fall mache ich das viel allgemeiner mit einer Karte von Wörtern und deren Ersatz, aber das ist ein Beispiel für etwas Bestimmtes.

+2

Wie ist der Fall, wenn der Ersetzungstext eine andere Länge als der ursprüngliche Text hat? Z.B. Ersetzen Sie "abcDe" durch "xy". Was sollte die Ausgabe sein? – VHS

+0

Ja, in diesem Fall wird der gemischte Fall - mit Ausnahme des ersten Buchstabens - aus diesem Grund nicht berücksichtigt. Also würde "abcDe" "xy" werden, aber "AbcDe" würde "Xy" werden. Editiert das Original mit einem Beispiel. – drawk

+0

Willkommen bei Stack Overflow! Wir sind eine Frage-und-Antwort-Seite, kein Coder-for-Hire-Service. Bitte schränken Sie Ihre Frage auf ein bestimmtes Problem ein, das für diese Website am Thema wäre. Siehe: [Warum ist "Kann mir jemand helfen?" keine eigentliche Frage?] (http: //meta.stackoverflow.com/q/284236) und [Wie stelle ich eine gute Frage, wenn ich nicht sicher bin, wonach ich suche?] (https://meta.stackoverflow.com/questions/262527/how-to-ask-a -good-question-wenn-im-nicht-sicher-was-ich-suche-nach) –

Antwort

1

die target Teilzeichenfolge Gegeben:

  • ein StringBuilder erstellen.

  • Schleife durch target und die replacement Zeichenfolge parallel, Zeichen für Zeichen.

  • In jeder Iteration untersuchen Sie den Fall der target Zeichen.

  • Fügen Sie dem StringBuilder das entsprechende replacement Zeichen hinzu, das zu diesem Fall geändert wird.

  • beim Austritt aus der Schleife mit den toString der StringBuilder einen Standard replaceAll von target in der ursprünglichen Zeichenfolge auszuführen.

einstellen, wie oben für target und replacement wobei null, leer benötigt oder unterschiedlich lang.

1

Sie können es die folgende Art und Weise tun (in einer Zeile), wenn regex ist nicht zwingend:

s1 = s1.replace(s2, s3.chars().mapToObj(i -> Character.isUpperCase(s2.charAt(s3.indexOf((char)i))) ? Character.toString(Character.toUpperCase((char)i)) : Character.toString(Character.toLowerCase((char)i))).collect(Collectors.joining())); 

Hier s1 die ursprüngliche Zeichenfolge ist, s2 die Zeichenfolge ersetzt werden und s3 ist die neue Zeichenfolge s2 zu ersetzen, indem der Fall von s2 beibehalten wird.

Verwandte Themen