String replacement mittels Pattern?!

ElJarno

Mitglied
Hi Leute,

grundlegend möchte ich aus einer gegebenen Bezeichnung eine gültige Windows Dateibezichnung erstellen. Klar man könnte alle ungültigen Zeichen durch String.replaceAll() elliminieren, vielleicht gibts ja auch einen schickeren Weg mittels Pattern zumal ich ja die die Dateinamen auch wieder zurück wandeln muss. Ensprechend Windows müsste ja folgende Ersatzregeln gelten:

\ -> §
/ -> %
: -> &
* -> °
? -> ~
" -> `
< -> }
> -> {
| -> ´

Die anderen Zeichen sind willkürlich gewählt. Vielleicht fallen euch ja noch bessere ein.

Gruß Jan
 
Wenn ich das richtig verstehe willst du anhand eines einzigen Ausdruckes sagen:
Wenn du Suchzeichen 1 findest, dann ersetze es mir durch das Ersatzzeichen 1
Wenn du Suchzeichen 2 findest, dann ersetze es mir durch das Ersatzzeichen 2
...

Mir persönlich ist kein Weg bekannt. Ich denke du kommst um ein eigenes Stückchen Code nicht vorbei, aber das ist in meinen Augen auch nicht schwierig (4 Zeilen Code?!). Viel Glück!

Edit: ich muss mich korrigieren, ich glaube es gibt doch eine Möglichkeit, welche ich jedoch nie selbst ausprobiert habe. Mir ist eingefallen, dass mir StringUtils schon des öfteren einige Zeilen Code erspart hat und tatsächlich ich habe etwas gefunden, was dir weiterhelfen könnte:
http://commons.apache.org/lang/api-...ring, java.lang.String[], java.lang.String[])
 
Zuletzt bearbeitet:
@Honni
Wenn du nicht den Link gepostet hättest wäre ein Hinweis das SwinUtils zur ApacheCommons-Lib gehört nicht schlecht gewesen.
 
Wenn ich das richtig verstehe willst du anhand eines einzigen Ausdruckes sagen:
Wenn du Suchzeichen 1 findest, dann ersetze es mir durch das Ersatzzeichen 1
Wenn du Suchzeichen 2 findest, dann ersetze es mir durch das Ersatzzeichen 2
...

Genau richtig. ja mit rplaceall wärens ja mindestens 8 zeilen gewesen -> eins für jedes zeichen. und dann noch mal das ganze wieder in die andere richtung. is ja auch immer ne sache der performance. deswegen wollt ich einen einfacheren performanteren weg haben. ich versuchs mal mit der lösung im link.

danke
 
String.replaceAll() wäre eine schlechte Wahl gewesen weil replaceAll() einen Regulären Ausdruck verlangt. Wenn überhaupt wäre hier String.replace() wohl besser.
 
String.replaceAll() wäre eine schlechte Wahl gewesen weil replaceAll() einen Regulären Ausdruck verlangt. Wenn überhaupt wäre hier String.replace() wohl besser.

Warum wäre es eine schlechte Wahl?
Normal sollte es keine Probleme geben, damit einzelne Zeichen zu ersetzen. Ein Regulärer Ausdruck kann ja auch nur ein Zeichen enthalten.

Gruß

Sascha
 
Naja gut ... nur ich hab mich auch schon selbst ertappt wie man sich bei RegEx verrennen kann weil man vergessen hat das eine Methode eine RegEx verlangt und keine CharSequenz. Auch ist der Name irreführend. Das ALL rühert vermutlich daher das eben ALLE Sub-Strings auf die die RegEx zutrifft ersetzt.
 
habs jetzt so gelöst:
Code:
	private static String[] validChars = new String[] { "§", "%", "&", "°", "~", "`", "{", "}", "´" };
	private static String[] invalidChars = new String[] { "\\", "/", ":", "*", "?", "\"", "<", ">",
			"|" };

	public static enum ChangeFormat {
		WINDOWS_FILENAME, ORIGINAL_FORMAT;
	}

	// private static String validPattern = "*[§%&°~`{}´]";
	// private static String invalidPattern = "*[*\\/:*?\"<>|]";
	/**
	 * Sonderzeichen die nicht als Dateiname zulässig sind werden in zulässige
	 * Zeichen nach folgenden Regeln umgewandelt.
	 * 
	 * <pre>
	 * \ -> §
	 * / -> %
	 * : -> &
	 * * -> °
	 * ? -> ~
	 * " -> `
	 * < -> }
	 * > -> {
	 * | -> ´
	 * </pre>
	 * 
	 * @param bean
	 * @param version
	 * @return
	 * @return
	 */
	public static String replace(String text, ChangeFormat change) {
		if (change.equals(ChangeFormat.WINDOWS_FILENAME)) {
			for (int i = 0; i < validChars.length; i++) {
				String newStr = validChars[i];
				String oldStr = invalidChars[i];
				text = text.replaceAll(oldStr, newStr);
			}
		} else if (change.equals(ChangeFormat.ORIGINAL_FORMAT)) {
			for (int i = 0; i < validChars.length; i++) {
				String newStr = invalidChars[i];
				String oldStr = validChars[i];
				text = text.replaceAll(oldStr, newStr);
			}
		}
		return text;
	}
 
Zurück