xx.xx.xx <-nur /w & /. aber !2x '.' hintereinander

  • Themenstarter Themenstarter Regex
  • Beginndatum Beginndatum
R

Regex

Gast
Hallo erstmal
und gleich als zweites: Ich weiß, blöder titel aber das beste was mir eingefallen ist.

Ich hätte gerne einen regex ausdruck, der alle wortchars (also: /w) und punkte erlaubt.
So weit bin ich bereits gekommen:
Code:
[\\w\\.]*
Jetzt würde ich es gerne noch so haben, das keine zwei punkte hintereinander sein dürfen. (möglichst auch nicht am anfang oder am ende, das überprüfe ich sonst aber zunot 'per Hand').
Leider war das das erste mal, das ich mit regex ausdrücken zu tuen hatte, deswegen komme ich nicht weiter.
Wäre jemand so nett, mir zu sagen, was ich hinzufügen muss?

Regex
 
Edit: mit bisschen getrickste gehts so zumindest. Ka wie "sauber" das ist, aber who cares 😳
edit: so jetzt glaub ich aber 😀
Java:
^[^\.]([a-zA-Z]*[\.]?)*[a-zA-Z]*[^\.]$

verbietet '.' am anfang und ende und zwischen drin kann man höchstens alle 2 zeichen 1 punkt setzen, keine zwei aufeinander aber insgesamt so viele man will

p.s.: wenns wirklich immer nur ab.cd.ef sein soll kanste die )* klammer auch vor das letzte * setzen, dann müssen immer 2 buchstaben zwischen einem punkt '.' sein
 
Zuletzt bearbeitet:
Wow,
danke das du so schnell geantwortet hast. (Auch wenn ich die Antwort erst heute um etwa 13:00 gesehen habe 😉.

Der Regex tut schon beinahe was er soll, nur mit dem Fall 'xxx..xxx.xxx' hat er Probleme.
Ich habe deinen jetzt etwas umgewandelt und so sollte er funktionieren:

Java:
import java.util.regex.Pattern;

public class PatternTest {

	public static void main(String... strings) {
		String[] patternS = new String[] {
				"^[^\\.]([a-zA-Z]*[\\.]?)*[a-zA-Z]*[^\\.]$",
				"^[\\w]+([\\.][\\w]+)*?$" };

		for (String patS : patternS) {
			Pattern p = Pattern.compile(patS);
			System.out.println("__________>");
			testString("", p, false);
			testString(".", p, false);
			testString(".com", p, false);
			testString("com", p, true);
			testString("com.", p, false);
			testString("com.foo", p, true);
			testString("com.foo.", p, false);
			testString("com.foo.bar", p, true);
			testString("com.foo..bar", p, false);
			testString("com.foo.µ", p, false);
		}
	}

	private static void testString(String string, Pattern pat, boolean setpoint) {
		boolean matches = pat.matcher(string).matches();
		(matches == setpoint ? System.out : System.err).printf(
				"Pat: '%s', String: '%s', matches: '%b', Setpoint: '%b'\n",
				pat.pattern(), string, matches, setpoint);
	}
}
Vielen dank für die hilfe und schönen tag noch.
(Das nächste mal, wenn ich mir einen regex erstellen muss, habe ich alles was ich jetzt drüber weiß bereits wider vergessen 🙂)

Regex
 
Hey

'xxx..xxx.xxx' sollte doch auf false sein, oder? Du sagtest, dass zwei auf einander folgende Punkte verboten sein sollen

Grüße
 
'xxx..xxx.xxx' sollte doch auf false sein, oder?
Ja, war ich da etwa zu blöde zum testen. Moment, schnell gucken...


Ne, die 'Test-Reihe' stimmt,
Code:
System.out.println("xxx..xxx.xxx".matches("^[^\\.]([a-zA-Z]*[\\.]?)*[a-zA-Z]*[^\\.]$"));
ergibt 'true' obwohl es 'false' sein sollte.

Ich glaube ich weiß auch warum, '*' bedeutet ja {0, }zeichen.
So müsste das stimmen:
Code:
"^[^\\.]([a-zA-Z]+[\\.]?)*[a-zA-Z]*[^\\.]$"
.
regexens ist mistig, wie schnell hat man sich vertippt.
Dann ist aber glaube ich der fall "" auch 'false'. Aber das ist nicht schlimm.

Regex
 
Java:
public class Main {
	public static void main(String[] args) {
		System.out.println("xxx..xxx.xxx".matches("^[^\\.]([a-zA-Z]+[\\.]?)*[a-zA-Z]*[^\\.]$"));
	}
}

ergibt bei mir false
 

Neue Themen


Zurück
Oben