Scala-Ausdruck zum Ersetzen einer Dateierweiterung in einer Zeichenfolge

7

Hier ist eine Version, die ich mit split geschrieben habe:

%Vor%

Dies transformiert z.B. foo.bar.coffee in foo.bar.js .

Was ich mag:

  • es funktioniert
  • es ist nicht auf Dinge wie indexOf() angewiesen
  • es fühlt sich funktional an;)

Was ich nicht mag:

  • es ist nicht so kurz, wie ich hoffen würde
  • es könnte einige Leser verwirren

Wie kann ich eine noch einfachere / einfachere Version schreiben?

UPDATE: Gute Antworten unten! Kurz gesagt:

  • scheint mein ursprünglicher Ansatz oben zu sein, war nicht schlecht, obwohl er einige Eckfälle nicht abdeckt, aber das ist mit einem längeren Ausdruck reparierbar, wenn Sie diese
  • abdecken müssen
  • Ein anderer, etwas kürzerer Ansatz verwendet Regexps, die je nach Regexp-Hintergrund mehr oder weniger lesbar sind
  • eine etwas kürzere Syntax für den ursprünglichen Ansatz (Eckfälle nicht abgedeckt) lautet:

    fileName.split('.').init :+ "js" mkString "."

ebruchez 19.01.2011, 01:23
quelle

6 Antworten

9

Ich fürchte, Sie müssen es tatsächlich länger machen , um das wahrscheinlich sinnvollste robuste Ding zu machen:

%Vor%

Irgendwie unerwartet, den Namen Ihrer Datei zu verlieren (zumindest wenn Sie ein Endbenutzer sind)!

Lass uns Regex ausprobieren:

%Vor%

Habe den Dateinamen nicht verloren, aber es gibt auch keine Erweiterung. Ack.

Lass es uns reparieren:

%Vor%

Oder mit Regex:

%Vor%

(Beachten Sie das unterschiedliche Verhalten im Eckfall, bei dem der Dateiname mit Punkten endet.)

    
Rex Kerr 19.01.2011, 02:39
quelle
3

Wird ein einfacher Regex-Ersatz den Trick machen?

Wie:

%Vor%     
Eric 19.01.2011 01:55
quelle
2

Sie können immer die Methode replaceAll für java.lang.String

verwenden %Vor%

Es ist kürzer, aber weniger lesbar.

    
Synesso 19.01.2011 01:55
quelle
2

Was ist los mit lastIndexOf?

%Vor%

Natürlich, wenn Sie den Dateinamen behalten wollen, wenn er keinen Punkt enthält, müssen Sie ein wenig mehr tun

%Vor%     
Landei 19.01.2011 07:39
quelle
2

Sehr einfach mit lastIndexOf, und arbeiten mit Dateinamen, die mehr als einen Punkt enthalten

%Vor%

Ergebnis ist foo.bar.js

    
Slavik Muz 19.12.2016 16:41
quelle
2

Also, ich werde hier Geschwindigkeit anstreben. Wie dem auch sei, substring ist eine konstante Zeit, weil die Zeichenfolge einfach nicht kopiert wird. Also,

%Vor%

Dies verwendet eine Schließung, die es ein wenig verlangsamen wird. Schneller:

%Vor%

BEARBEITEN: Wie dem auch sei, kopiert Java jetzt die Zeichenfolge in substring .

    
Daniel C. Sobral 19.01.2011 12:13
quelle

Tags und Links