Regex - Jeder buchstabe nur einmal

kayf

Mitglied
Hey Leute,

ich probiere die ganze Zeit vergeblich einen RegEx zu schaffen, der jeden Buchstaben nur einmal zulässt.:rtfm:

Ich möchte String.match benutzen und wissen ob, alle 26 Buchstaben [A-Z] vorhanden sind. Die Reihenfolge spielt dabei keine Rolle. Jeder Buchstabe halt nur einmal.

Zum Szenario:
ich bekomme also einen String der nur Großbuchstaben von A-Z enthält. Dieser String soll nur gültig sein, wenn das A nur einmal vorkommt, das B, das C usw.. Aber es soll jeder Buchstabe einmal da sein.

Danke Kay
 
Musst du das unbedingt mit nem Regex lösen? Das geht mit den String Methoden sehr viel schöner mMn.
 
Danke für die Antwort EikeB!
Nein muss kein regex sein.

Welche String Methode schwebt dir denn vor ?

Es muss doch auch über Regex zu lösen sein oder nicht ?
 
String.matches([A-Z]{26}) ? ja -> Char-Array --> Array sortieren --> durchlaufen und prüfen
oder
Java:
	public static boolean checkAlphabet(String stringToCheck){
		return stringToCheck.matches("[A-Z]{26}") && new HashSet<String>(Arrays.asList(stringToCheck.split("(?<=.)"))).size() == 26;
	}
(besserer Einzeiler ist mir nicht eingefallen 😳)
oder ....
oder ....
 
Du kannst dir pro Buchstabe einen Regex zusammenbauen der Prüft ob der jeweilige Buchstabe exakt einmal vorkommt.
Java:
	private static boolean test(final String word) {
		String[] letters = {"A", "B", "C", "D"};

		for (String l : letters) {
			if (!word.matches("[^" + l + "]*" + l + "[^" + l + "]*")) return false;
		}

		return true;
	}
Oder eben dass "exakt einmal vorkommen" mit den String Methoden (z.b. indexOf) lösen.
 
ich würde sowas vorschlagen:

Java:
	public static boolean check(String str) {
		if (str.length() != 26) return false;
		boolean[] bitSet = new boolean[26];
		for (char c : str.toCharArray()) {
			if (c < 'A' || c > 'Z' || bitSet[c-65]) return false;
			bitSet[c-65] = true;
		}
		return true;
	}
 
ich würde sowas vorschlagen:

Java:
	public static boolean check(String str) {
		if (str.length() != 26) return false;
		boolean[] bitSet = new boolean[26];
		for (char c : str.toCharArray()) {
			if (c < 'A' || c > 'Z' || bitSet[c-65]) return false;
			bitSet[c-65] = true;
		}
		return true;
	}
Lechtet schnell ein!

Jedoch am besten finde ich:
Java:
public static boolean checkAlphabet(String stringToCheck){
        return stringToCheck.matches("[A-Z]{26}") && new HashSet<String>(Arrays.asList(stringToCheck.split("(?<=.)"))).size() == 26;
    }
	}

Danke euch allen!
 

Zurück
Oben