RegEx für String mit Kommas und Semikolons

RalU

Mitglied
Hallo,
ich suche einen RegEx, der z.B. folgenden Strings findet
Bsp1:
Code:
Kat1, ein weiteres; noch eins, 234f3,beliebig
Bsp2:
Code:
Kat1; weitere Kategorie, noch eine
Bsp3:
Code:
nur eine Kategorie
- eine Kategorie besteht aus beliebigen Zeichen (auch Leerzeichen)
- der String muss mindestens eine Kategorie enthalten
- der String darf maximal 5 Kategorien enthalten
- jede Kategorie wird durch ',' oder ';' getrennt (Leerzeichen vor und nach dem ',' bzw. ';' sind erlaubt)
- bei einer Kategorie (oder bei der letzten Kategorie) darf kein ',' oder ';' mehr stehen

bisher hab ich folgendes als RegEX:
Code:
[.*\\,.*|.*\\;.*|[^,\\S|^;\\S]*]{0,5)
was leider nicht so funktioniert.

Vielleicht wäre es eine Alternative, einfach zu prüfen, ob in einem beliebigen String höchstens 4 mal ein ',' oder höchsten 4 mal ein ';' (auch gemicht) vorkommt. Wie könnte denn so ein RegEx aussehen?

Gruß, Ralf
 
Java:
import java.util.regex.*;

public class TestFuerRaIU {
	public static void parseCategoryString(String cs) {
		Pattern p = Pattern.compile("[^(;|,)]+([;,][^(;|,)]+){0,4}");
		Matcher m = p.matcher(cs);
		
		if(m.matches()) {
			System.out.println("Richtig");
		}
		else {
			System.out.println("Falsch");
		}
	}
	
	public static void main(String[] args) {
		//richtige Beispiele
		parseCategoryString("Kat1, ein weiteres; noch eins, 234f3,beliebig");
		parseCategoryString("Kat1; weitere Kategorie, noch eine");
		parseCategoryString("nur eine Kategorie");
		parseCategoryString("nur eine Kategorie, noch eins");
		
		//falsche Beispiele
		parseCategoryString("; nur eine Kategorie, ein weiteres");
		parseCategoryString("Kat1;, ein weiteres");
		parseCategoryString("Kat1;");
		parseCategoryString("Kat1, ein weiteres; noch eins, 234f3,beliebig;zu viel");
	}
}

Ausgabe:
Code:
Richtig
Richtig
Richtig
Richtig
Falsch
Falsch
Falsch
Falsch

Edit:
Zu deinem Regex...
[.*\\,.*|.*\\;.*|[^,\\S|^;\\S]*]{0,5)

; und , sind keine Metazeichen, du benötigst keine vorangestellten \\.
Wieso benutzt du \\S? Das bedeudet du suchst Zeichen, die keine Whitespaces sind, aber ein Leerzeichen doch auch vorhanden sein?!
.* ist fatal, du suchst damit ein BELIEBIGES zeichen quasi unendlich lange, damit auch deine , und ;
 
Zuletzt bearbeitet:
Zurück