# Designproblem, Regex



## Gelöschtes Mitglied 5909 (18. Jul 2006)

Zunächst erklär ich mal kurz was ich vorhabe:
Ich möchte ein kleinen board-code-converter schreiben, 
der die codes zwischen zwei boards hin und her convertieren kann. (später vielleicht mehr)

Mein erstes Problem:
Wie mache ich den code möglichst universell?
Ich habe mich dafür entschieden, einen Singleton RegexManager zu schreiben, der die Regex verwaltet.
Die Regex sind in einer .txt file gespeichert und werden zunächst geladen. 
(mit "," abgetrennt und split() in ein String[] geladen - eventuell schönere variante?)
Der Manager übergibgt nun meinem RegexHandler ein regex und convertiert alles für diese eine regex.
Irgendwo muss aber noch hin, welches quell und zielformat ist - 
und ich will später noch ein GUI dazu schreiben (mein erstes GUI). 
Wo soll der input String und der output String verwaltet werden?

was würdet ihr am design ändern?

Mein zweites Problem:
Regex.
Ich habe bisher noch nix mit Regex gemacht, außer replaceAll() und replace() vielleicht... 
was für die einfachen Tags noch ok ist.
Aber wie Konvertiere ich zum Beispiel [font face=courier color=red size=4]...[/font]
 in ...
 und umgekehrt? Und was mach ich, wenn da außenrum noch ein Link is?
Desweiteren kann ich ja dann replaceAll() z.b. nicht mehr benutzen, 
da der ja sonst mehrere unterschiedliche Links mit dem ersten Link den er findet ersetzt - oder?

Was ich bisher habe:


```
package bcc.logic;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class RegexManager {
	
	private final static String eZBoard = "./Ezboard.txt";
	private final static String vBulletin = "./vBulletin.txt";
	private static RegexManager INSTANCE;
	private static String[] regex;
	private static String input;
	private static String output;
	
	private RegexManager() {
	}

	public RegexManager getInstance() {
		if (INSTANCE == null) {
			return new RegexManager();
		} else {
			return INSTANCE;
		}
	}
	
	/**
	 * Loads regular expressions from a file, stored on the local system.
	 * @param file text-file with regular expressions, seperated with ",".
	 * @return String-array with all regular expresseions from the file.
	 */
	private static String[] loadRegex(File file) {
		String line = "";
		String regex = "";
		try {
			FileReader fReader = new FileReader(file);
			BufferedReader buffer = new BufferedReader(fReader);
			while ((line = buffer.readLine()) != null) {
				regex+= line;
			}
			fReader.close();
			buffer.close();
		} catch (FileNotFoundException fnfe) {
			System.err.println("File " + file + "not found");
		} catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}
		regex.replaceAll("\n","");
		return regex.split(",");
	}

	public void convertAll() {
		regex = loadRegex(new File(eZBoard));
		RegexHandler handler = new RegexHandler(regex[0]);
		for (int i = 1; i < regex.length; i++) {
			handler.convert();
			handler.setRegex(regex[i]);
		}
	}
	
	public static String getInput() {
		return input;
	}

	public static void setInput(String input) {
		RegexManager.input = input;
	}

	public static String getOutput() {
		return output;
	}

	public static void setOutput(String output) {
		RegexManager.output = output;
	}
	
}
```


```
package bcc.logic;

public class RegexHandler {
	
	private String regex = "";

	public RegexHandler(String regex) {
		this.regex = regex;
	}

	public String getRegex() {
		return regex;
	}

	public void setRegex(String regex) {
		this.regex = regex;
	}
	
	public void convert() {
		//input String mit aktuellem regex bearbeiten
	}
}
```


hier is eine übersicht der tags:
http://www.mytempdir.com/811011

Danke schonmal


----------



## Wildcard (18. Jul 2006)

Mal angenommen du verwendest quelloffene Forensoftware:
Ist es dann nicht einfacher du verwendest die schon vorhandenen Teile der Forensoftware zum parsen und zum Aufbauen des Baums und überführst anschließend nur den Baum auf die neue Syntax?
Regex alleine ist für deine Zwecke wohl nicht ausreichend...
btw: replaceAll und split verwenden zwat Regex, aber um höhere Sachen zu machen brauchst du die Pattern Klasse und die Matcher Klasse...


----------



## Gelöschtes Mitglied 5909 (18. Jul 2006)

vbulletin is kommerziell und ezboard auch...
das muss doch irgendwie gehn


----------



## Wildcard (18. Jul 2006)

Gehen schon, aber ich kann mir fast nicht vorstellen das RegEx ausreichend ist (hab mir die Syntax nicht weiter angesehen). Vermutlich wirst du Parsen müssen.
Viel Spaß damit  :###


----------



## Gelöschtes Mitglied 5909 (19. Jul 2006)

des hilft mir nu nicht wirklich weiter, weil ich nich weiß wie ich einen parser schreib.
Ich könnte aber einen XML parser umschreiben, beispielsweise SAX, der dann [ und ] statt <> annimmt. Geht das? wenn ja, wie


----------

