inputPattern

Input Pattern Beispiel-Übungen

Wenn Du das Tutorial durchgearbeitet hast, kennst Du eigentlich die wesentlichen Bestandteile des Musterbaus. Wir versuchen jetzt mal gemeinsam einige Muster zu bauen, damit das Ganze seinen Schrecken verliert.

Natürlich mußt Du Dich erstmal schlau machen, welchen Regeln die Eingabe folgen soll. Eine Hausnummer, ein Autokennzeichen, eine Buch-ID oder die Mitgliedsnummer in Deinen Turnverein haben (im besten Fall) eine bestimmte Logik. Diese mußt Du zuerst erkennen um Dein Muster richtig erstellen zu können. Eine Quelle könnte zum Beispiel Wikipedia sein, oder die Seiten der KFZ-Zulassungsbehörde oder oder oder... Am besten ist natürlich wenn Dein Auftraggeber, seine Regeln klar definieren kann. (Ich habe gehört, dass es sowas geben soll!).

Mobile Vorwahlnummer

Anforderung TOP EN

Ein Webseitenbetreiber möchte auf seiner Seite ein Eingabefeld für eine deutsche Mobilfunknummervorwahl.
Allen deutschen Netzvorwahlen für Mobilfunk ist gemeinsam, dass sie sich aus der nationalen Verkehrsausscheidungsziffer 0, der Netzkennung 15/16/17 sowie der ein- bis zweistelligen Blockkennung zusammensetzen. (Bei der Netzkennung 15 ist die Blockkennung zweistellig, ansonsten einstellig.) 0151n, 0152n, 0157n, 0159n, 0160, 0162, 0163, 017n (Wikipedia Beispiel! Kein Anspruch auf Richtigkeit!)

Bauanleitung

Also die Gemeinsamkeiten. '01' fällt sofort ins Auge. 0151n, 0152n, 0157n, 0159n, 0160, 0162, 0163, 017n. Dies können wir uns ja schon mal notieren. pattern = "01"

Die nächste Ziffer ist eine 5, eine 6 oder eine 7, also nehmen wir das pipe |für die Alternativen und schreiben das in runde Klammern. pattern = "01(5|6|7)"

Nach einer 5 folgt eine 1, 2, 7 oder 9, hier können wir die eckige Auswahl-Klammer nutzen..5[1279].. = 51 oder 52 oder 57 oder 59.
Es folgt eine beliebige Ziffer Du nimmst am besten die Kurzschreibweise \d ..5[1279]\d.. = pattern="01(5[1279]\d|6[023]|7)

Und die zweite Option: Nach einer 6 folgt eine Ziffer 0, 2 oder 3. Auch hier nutzen wir die Auswahl-Klammer...6[023]...

Und die dritte Option: Nach einer 7 folgt eine beliebige Ziffer 0 bis 9. Auch dafür könnten wir das vordefinierte Zeichen verwenden. ..7\d..

Jetzt setzt Du das ganze noch zusammen pattern="01(5[1279]\d|6[023]|7\d)
Noch ein ausführlicher Test mit vielen richtigen und fehlerhaften Eingaben - ich glaube, so passt das.

Test

D - mobile Vorwahl: Format: 015xx oder 0162 oder 017x
pattern="01(5[1279]\d|6[023]|7\d)

01521
0162
0171
0175
01531
0164
017
01725

ISBN

Internationale Standardbuchnumme ISBNTOP EN

Dein Buchhändler (ja, das ist der mit dem bedruckten Papier - hast Du bestimmt schon mal in einen der großen Einkaufstempel gesehen..) möchte gern die Internationale Standardbuchnummer ISBN als Ergänzung auf seiner Bestellseite. Du findest die Nummer auf der Rückseite eines jeden Taschenbuches oder bei gebundenen Büchern auf der Umschlagseite. Damit es nicht zu einfach ist gibt es 2 ISBN-Typen.
Die ISBN-10 - wer hätte das gedacht - hat immer 10 Ziffern, und besteht aus vier Teilen. Der Gruppennummer, der Verlagsnummer, der Titelnummer und die Prüfziffer. Die drei ersten Gruppen können unterschiedlich viele Ziffern (1 bis 7) enthalten, die Prüfziffer ist einstellig. Beispiel: ISBN 386-6801-92-9
Die zweite Variante die ISBN-13, nun ja, besteht aus gesamt 13 Ziffern, sie hat nämlich einen Präfix: "978" oder "979". Beispiel: ISBN 978-3-86680-192-9
Die Vorschrift besagt, dass die Gruppen mit Trennstrichen "-" zu formatieren sind.

Bauanleitung

Also der ISBN13-Präfix ist schnell gebaut: 97 + eine 8 oder 9 pattern="97[89]". Da es optional ist, setzen wir es in Klammern mit einem Fragezeichen (einmal oder keinmal) pattern="(97[89]-)?
Müssten wir nicht diese Trennstriche mit dieser Regel (1 bis 7 Ziffern) einbauen, nicht wäre auch der Rest schnell erledigt. ohne Präfix oder | mit Präfix, fertig.pattern="\d{10}|97[89]\d{10}"

Aber die Regel ist komplizierter. Die ISBN besteht im folgenden aus 3 Blöcken, die zwischen 1 bis 7 Ziffern \d{1,7} haben können und durch Trennstriche- getrennt sind und dann kommt noch eine Prüfziffer dazu \d{1,7}-\d{1,7}-\d{1,7}-\d. Oder kurz (\d{1,7}-){3}\d

Die ISBN muss gesamt, abgesehen vom Präfix, aus 13 Zeichen (10 Ziffern + 3 Trennstriche) bestehen. So wie wir das Muster im Augenblick haben, kann es ohne Präfix zwischen 4 und 22 Zeichen bestehen, das ist natürlich nicht optimal. Die ISBN ist ein schönes Beispiel wie man Vorhersagen (?=..) anwendet. Wir sagen nämich voraus, dass die Eingabe nur korrekt ist, wenn sie aus insgesamt 13 Zeichen besteht. pattern="(?=.{13}$)(\d{1,7}-){3}\d"

Da jeder Block mindestens einmal vorkommen muss, kann ein einzelner Block nicht länger als 7 werden, damit ist die Regel auch erfüllt wenn wir das Muster ein klein wenig straffen. + steht für 1mal oder mehr, das nehmen wir: pattern="(?=.{13}$)(\d+-){3}\d"

Der optionale Präfix vorn angebaut: pattern="(97[89]-)?(?=.{13}$)(\d+-){3}\d". Wunderbar!

Obwohl es eigentlich gegen die Regel verstößt bauen wir auch noch eine Varante ohne Trennzeichen, denn bei der Eingabe ist der Trennstrich lästig, was dann aber zur Anzeige eventuell z.B. mit Javascript bzw. auf dem Server korrigiert werden muss, ebenso wie die Prüfziffer einem Test unterzogen werden sollte. \d{10}|97[89]\d{10} bauen wir mit dem pipe | vorn an unser Muster. ==> pattern="\d{10}|97[89]\d{10}|(97[89]-)?(?=.{13}$)(\d+-){3}\d

Diesen Teil \d{10}|97[89]\d{10} könnte man auch (97[89])?\d{10} kürzen. ==>pattern="(97[89])?\d{10}|(97[89]-)?(?=.{13}$)(\d+-){3}\d

Test

ISBN-10 ISBN-13 Format: (978-)12-345-6789-0 oder (978)1234567890
<input type="text" pattern="(97[89])?\d{10}|(97[89]-)?(?=.{13}$)(\d+-){3}\d">

978-12-345-6789-0
978-12-345678-9-0
979-1-2345-6789-1
978-123-45-6789-2
9781234567890
568-12345-6789-0
56812-3456-78-82
97912-345-78-82
978-1-2345-6-7891
9731234567890

Datum

Pattern für das Datum, Monatsgenau mit SchaltjahrprüfungTOP EN

Das Formular soll ein Input-Feld für das Datum haben. Das Datum soll komplett vom Browser validiert werden. Und es soll Schaltjahre berücksichtigen. Seit dem Jahr 1584 wird alle 4 Jahre ein Tag (der 29.Februar) eingeschoben, nicht aber in Jahren die durch 100 glatt teilbar sind. Durch 400 teilbare Jahre aber dann doch. Puh..., na dann los.
Als Format nehmen wir das deutsche Format, also: TT.MM.JJJJ. Weitere Datumsformate dieser Welt (MM-TT-JJ, JJ/MM/TT ...) findest Du bei den Beispielen oder in der Datenbank. Ich denke es gibt viele Lösungen, eine mögliche Lösung (die Beste ) ist diese:

Bauanleitung

28Tage: Alle Monate des Jahres haben mindestens 01 bis 28 Tage. Da das nicht so einfach so zu bemustern ist, teilen wir das logisch auf.
01 - 09 0[1-9]oder
10 - 19 1\doder
20 - 28 2[0-8]
Das bauen wir gleich mit 'oder' | zusammen. Die Tage: (0[1-9]|1\d|2[0-8]).
Die Monate mit mindestens 28 Tagen, also alle. Die Monate: (0[1-9]|1[012]).
Zusammen, zwischen Tag und Monat ein maskierter Punkt ( )\.( ): (0[1-9]|1\d|2[0-8])\.(0[1-9]|1[012]).

30 Tage Alle Monate außer dem Februar haben einen 29sten und 30sten Tag. Die Tage (29|30)
Die Monate 1 bis 12 ohne 2 (0[13-9]|1[0-2])
Zusammengebaut: (29|30)\.(0[13-9]|1[0-2])

31 Tage Einige Monate (01, 03, 05, ..) haben 31 Tage.
Die Monate: (0[13578]|1[02])
Zusammen:(31\.(0[13578]|1[02]))

Zusammengebaut: Richtig ist der erste oder der zweite oder der dritte Block: (28Tage.MM | 30Tage.MM | 31Tage.MM)
(0[1-9]|1\d|2[0-8])\.(0[1-9]|1[012])|(29|30)\.(0[13-9]|1[0-2])|(31\.(0[13578]|1[02]))

Und die Jahre gleich dabei \.\d{4} Das Jahr 0 das es nicht gab gleich mit negativer Voraussage ausschliesen (?!.*0000)
((0[1-9]|1\d|2[0-8])\.(0[1-9]|1[012])|(29|30)\.(0[13-9]|1[0-2])|(31\.(0[13578]|1[02])))\.(?!.*0000)\d{4}

-------------------------------

Der Schalttag 29 Der 29.Februar 29\.02\. wird ab dem Jahr 1584 alle 4 Jahre eingeschoben:
1584 - 1596 1584|1588]|1592|1596, kürzer: 158[48]|159[26]
1600 - 1996 1[6-9]([02468][048]|[13579][26])
2000 - 9996 [2-9]\d([02468][048]|[13579][26])
etwas kürzer schreiben:
(158[48]|159[26])|1[6-9]([02468][048]|[13579][26])|[2-9]\d([02468][048]|[13579][26])
Kürzer:
(158[48]|159[26])|(1[6-9]|[2-9]\d)([02468][048]|[13579][26])

So, in diesen Jahren gibt es also den 29.Februar, nicht aber in den Jahren die durch 100 glatt teilbar sind. (1700, 1800, 1900...). Durch 400 teilbare Jahre haben aber dann doch einen 29.Februar. Ich habe das jetzt einfach so gelöst, dass ich einfach die 400er-Schaltjahre 1600 - 9600 aufgeschrieben habe (16|[2468][048]|[3579][26])00 und das Kalenderjahr '0' müssen wir ausschliesen, da es das nie gab. Auch dafür ist die negative Voraussage gut geeignet. (?!.*0000)

(0[1-9]|1\d|2[0-8]\.0[1-9]|1[012])|(29|30)\.(0[13-9]|1[0-2])|31\.(0[13578]|1[02])

Test

Datum Format: TT.MM.JJJJ (Jahre:0-9999 mit Schaltjahren ab 1584
pattern="(?!.*0000)((0[1-9]|1\d|2[0-8])\.(0[1-9]|1[0-2])|(29|30)\.(0[13-9]|1[0-2])|31\.(0[13578]|1[02]))\.\d{4}|(29\.02\.)(((1[5-9]|[2-4]\d)(0[48]|[13579][26]|[2468][048]))|(16|[24]0|2[048]|3[26])00)">

29.02.2000
29.02.2016
30.04.2008
30.02.2015
31.00.2008
31.04.2008

Datum

Pattern für ein Zeitfenster TOP EN

Für einen Veranstaltungskalender brauchen wir eine Anmeldemaske, die von einem vorgegebenen Datum bis zu einen ebenfalls vorbestimmten Datum Eingabedaten akzeptiert. Das kann man bestimmt prima mit Javascript lösen. Aber das ist hier aber eine Anleitung über HTML5 form-input-pattern, und damit geht es auch. Als Vorgabe habe ich diesmal das Amerikanische Datumsformat YYYY-MM-DD gewählt. Der Datumszeitraum ist: 2014-08-18 bis 2015-06-16. Diese Vorgabe könnte man bereits auf dem Server setzen, bevor man die Seite ausliefert.

Bauanleitung

Zuerst zerlegen wir mal die Monate: Im Jahr 2014 hat der August 08 nur noch die Tage 18 bis 31. Die Tage müssen wir natürlich aufsplitten. Das heist der Tag kann sein 18 oder 19 1[89], einer der zwanziger Tage 2\d oder 30 und 31 3[01]. Somit haben wir die erste Option, die wir mit | verknüpfen. 08-(1[89]|2\d|3[01])
September und November 09|11 haben jeweils 30 Tage. Tag eins bis neun 0[1-9], die Tage 10 bis 29[12]\d und der dreisigste 30 zusammengefasst also (09|11)-(0[1-9]|[12]\d|30)
Die Monate 10 und 12 10|12 oder 1[02] haben 31 Tage. 1[02]-0[1-9]|[12]\d|3[01]
Für das Jahr 2014 haben wir also "2014-((Option1-14) oder (Option2-14) oder (Option3-14))" 2014-((08-(1[89]|2\d|3[01]))|((09|11)-(0[1-9]|[12]\d|30))|((10|12)-(0[1-9]|[12]\d|3[01])))

Im Jahr 2015 haben die Monate 1, 3 und 5 01|03|05 jeweils 31 Tage (0[135])-(0[1-9]|[12]\d|3[01])
Der Monat Februar hat nur 28 Tage 02-(0[1-9]|1\d|2[1-8])
Der Monat April hat 30 Tage 04-(0[1-9]|[12]\d|30)
Und der Juni hat nur die vorgegebenen 16 Tage 06-(0[1-9]|1[0-6])
Zusammen: "(2015-( (Option1)|(Option2)|(Option3)|(Option4) )"
Nun verknüpfen wir auch noch die Jahre mit dem OderZeichen | und ein paar Klammern (..) dazu:
(2014-((Option1-14)|(Option2-14)|(Option3-14))) | (2015-((Option1-15)|(Option2-15)|(Option3-15)|(Option4-15))) 2015-((02-(0[1-9]|1\d|2[1-8]))|(04-(0[1-9]|[12]\d|30))|((01|03|05)-(0[1-9]|[12]\d|3[01]))|(06-(0[1-9]|1[0-6])))

Test

Datum Format: 2014-08-18 bis 2015-06-16
<input type="text" pattern="201(4-((08-(1[89]|2\d|3[01]))|((09|11)-(0[1-9]|[12]\d|30))|((10|12)-(0[1-9]|[12]\d|3[01])))|(5-((02-(0[1-9]|1\d|2[0-8]))|(04-(0[1-9]|[12]\d|30))|((01|03|05)-(0[1-9]|[12]\d|3[01]))|(06-(0[1-9]|1[0-6])))))">

2014-09-28
2015-02-28
2015-06-16
2014-07-28
2015-02-29
2015.02.28
2014-1-216

Pattern für deutsche KFZ-Kennzeichen

Anforderung deutsche Kennzeichen

Dein Formular für ein Versicherungsbüro soll ein Feld für das KFZ-Kennzeichen erhalten, das schon vor dem Absenden die Gültigkeit prüft. Es sollen nur Kennzeichen aus Deutschlad berücksichtigt werden.
Ein deutsches Kennzeichen kann 1 bis 3 Buchstaben als Unterscheidungszeichen (Stadt / Kreis) haben.Es darf nicht kürzer als 5 und nicht länger als 8 Zeichen (+ 1 Leerzeichen) sein. Früher übliche Trennstriche werden nicht akzeptiert. Es gibt keine 3 gleiche Buchstaben hintereinander.(A und AA aber kein AAA). Bestimmte Buchstabenkombinationen sind verboten und es gibt historischen Fahrzeuge, die ein H an letzter Stelle haben können und die Elektrokarren :) E. Sonderkennzeichen werden nicht im Muster eingebaut. Viele Kommunen haben Ihre eigenen Regeln, deshalb kann auch dieses Beispiel eben nur ein Beispiel sein.

Bauanleitung

Ein Kennzeichen kann 1 bis 3 Buchstaben als Unterscheidungszeichen (Stadt / Kreis) haben. [A-Z]{1,3}

Es folgen nach einer Leerstelle (- den früher üblichen Bindestrich akzeptieren wir nicht mehr.) 1 bis 2 Buchstaben[A-Z]{1,2} .. sowie 1 bis 4 Zahlen. \d{1,4}

Da jetzt aber ein KFZ-Kennzeichen nicht kürzer als 5 und nicht länger als 8 Zeichen (+ 1 Leer) lang sein darf, geben wir die Gesamtlänge mit der vorausschauende Aussage an. (?=.{6,9}$)

Natürlich gibt es noch weitere Einschränkungen. Zum Beispiel gibt es als Unterscheidungszeichen zwar A und AA aber kein AAA, es gibt also keine 3 gleiche Buchstaben hintereinander. Wir schliesen also 3 gleiche Buchstaben mit der negativen Voraussage (?!...und dem Verweis auf einen Klammerinhalt/1aus:(?!(.)\1\1)

Nun sind bestimmte Buchstabenkombinationen nicht zugelassen. Auch diese können wir mit der negativen Voraussage ausschliesen.
(?!HJ|KZ|NS|SA|SD|SS|R[A-Z])
Achja, da gabs doch noch die historischen Fahrzeuge, die ein H an letzter Stelle haben können und die Elektrokarren :) E , aber die Gesamtlänge bleibt gleich.

Test

KFZ-Kennzeichen Format: A BC1234 oder AB C1234 oder ABC D123
pattern="(?=.{6,9}$)(?!(.)\1\1)([A-Z]){1,3} (?!HJ|KZ|NS|SA|SD|SS|R[A-Z])[A-Z]{1,2}\d{1,4}[HE]?"

AA KA256
AA KA2356
S TR1245
STR A1245
E S1234
AA KA235H
AA-KA256
AAA KA256
STR AB1245
ST AB 12
ST KZ123
AA KA2356H

Schulnoten

Anforderung

Diese Übung betrachtet das Notensystem das in Deutschland und einigen anderen Ländern üblich ist. Eine Schulnote ist nicht einfach eine Zahl zwischen 1 und 6. Es gibt zig Schulnoten-Systeme. Schauen wir mal, ob wir dazu ein paar Muster bauen können.
Das Deutsche Notensystem hat sechs Stufen. Je nach Bundesland oder Schulart und noch einige andere Kriterien werden ganze Noten, halbe Noten, viertel Noten oder zehntel Noten, mit ein oder zwei Nachkommastellen genutzt. Teilweise gibt es im Notensysten auch die Note 1+, was dann entweder 0,7 oder auch 0,75 bedeuten kann. Der Muster-Ersteller sollte dann eben wissen welche der Möglichkeiten er für sein Formular auswählen möchte bzw. muss.

Bauanleitung ganze Noten

Nun, ein Muster für eine ganze Note ist natürlich der einfachste Fall. Wir listen einfach alle gültigen Zahlen in einer eckigen Klammer auf. Wir können jedes Zeichen einzeln nennen, oder wir können den gültigen Bereich schreiben. Richtig ist auch eine Mischung von beidem. Schreiben kann man das entweder als Auflistung aller Zahlen 123456 oder als Bereich 1-6 oder gar einer Mischung von beidem [123-6]

Test

Format: n
pattern="[1-6]"
pattern="[123456]"
pattern="[1-456]"

1
3
6
7
$
A

Bauanleitung halbe Noten

Da ja der gesamte Ausdruck in eckigen Klammern [..] nur für ein Zeichen steht, müssen wir für mehrere Zeichen auch mehrere rechteckige Klammern [..][..]setzen. Das Komma können wir einfach dazwischensetzen. Das Muster sieht dann also so aus: [1-6],[05]. Aber hallo. Damit ist ja auch die Note 6,5 gültig. Also müssen wir die 6 aus der Gruppe herausnehmen und als Alternative mit dem 'oder'-Zeichen | anfügen.
Die PC-Werker, die statt dem Komma einen Punkt nehmen, müssen es eben ersetzen. Aber Achtung, der Punkt steht für ein beliebiges Zeichen, deshalb ist es mit dem Backslash \ zu maskieren! Wir können natürlich auch für Internationale Seiten mit beiden Alternativen bemustern, dann müsser wir das natürlich wieder in eckigen Klammern packen, da ja der gesamte Ausdruck in diesen Klammern Platzmacher für nur ein Zeichen ist.

Test

Halbe Noten: mit KommaFormat: n,0 n,5
pattern="[1-5],[05]|6,0"

1,0
2,5
5,0
1,0
A,4
6,5

Halbe Noten: mit Punkt Format: n.0 n.5
pattern="[12345]\.[05]|6\.0"

1.0
2.5
5.0
1.3
A.4
6.5

Halbe Noten: mit Punkt oder KommaFormat: n,0 n,5 n.0 n.5
pattern="[1-5][.,][05]|6[.,]0"

1.0
2,0
5.0
1,3
A.4
6.5

Bauanleitung Halbe Noten (optional)

Die halben Noten können eine Stelle nach dem Komma haben, müssen aber nicht. Wir nehmen einfach mal die Muster von oben und geben den Nachkommastellen das Optional-Zeichen ?. Da aber das Komma natürlich nicht als letztes stehen darf müssen wir es mit runden Klammern (..)gruppieren. Die Komma-Null nach der 6 müssen wir ebenso runde Klanmmern ([\.,]0)?einschliesen, weil ja das eine ohne das Andere nicht stehen kann und die Option dann für beide Stellen gilt.

Test

Halbe Noten Format: n oder n,0 oder n,5
pattern="[1-5]([.,][05])?|6([.,]0)?"

1
2,5
5.0
1,4
A.4
6.5

Bauanleitung Viertel Noten

Gut, die 6 ist klar, da kommt nur noch eine NachkommaNull. Das können wir so hinschreiben. 6,00 Falls es (für die Oberstufen) die 1+ gibt: eben auch noch die 0,75|6,00. Als weitere Noten gibt es noch die Zahlen 1 bis 5 0,75|6,00|[1-5] und die entsprechenden Nachkommastellen ,00 - ,25 - ,50 oder ,75. Dazu müssen wir die Nachkomma-alternative in eine Gruppe packen. (00|25|50|75)

Test

Viertel Noten Format: n,00 n,25 n,50 n,75
pattern="0,75|6,00|[1-5],(00|25|50|75)"

1.00
3,25
4,75
1,0
3,2
4.7

Viertel Noten Format: n,00 n,25 n,50 n,75
pattern="0,75|6,00|[1-5],([05]0|[27]5)"

1.00
3,25
4,75
1,0
3,2
4.7

Bauanleitung viertel Noten (optional)

Eigentlich wie oben, nur die Nachkommastellen müssen wir als Option behandeln.

Test

Nur eine Nachkommastelle:
pattern="0,7|6(,0)?|[1-5](,[0257])" ein oder zwei optionale Nachkommastellen:
pattern="0,7[05]?|[1-5](,(00?|2[05]?|50?|7[05]?))?|6(,00?)?"

0,7
3,2
4,75
0,8
4,325
7,2

Bauanleitung viertel Noten (optional mit +/-)

Nur so zum Spaß: Man könnte auch die Noten mit Plus- oder Minuszeichen so schreiben. Der Bindestrich - muß hier nicht maskiert werden! Außerhalb der eckigen Klammer sowiso nicht, innerhalb der eckigen Klammer nicht, weil er direkt an die Klammer anschliest. Das Pluszeichen mußt Du maskieren.

Test

Für die Oberstufe
pattern="1[+-]?|[1-5][+-]?|6+?"

1+
4-5
5-
0,8
4,325
6-

Bauanleitung zehntel Noten

Mit Komma. Oder mit Punkt oder Komma. Der Punkt muß hier nicht maskiert werden, weil er direkt an die Klammer anliegt.

Test

pattern="[1-5](,\d)?|6(,0)?"
pattern="[1-5]([.,]\d)?|6([.,]0)?"

5
13
0,8
19

Bauanleitung Punkte-Systeme

15 Punkte für die Oberstufe, 18 Punkte für die Juristenausbildung.

Test

Das 15 Punkte-System
<input pattern="1?[0-5]">

5
13
0,8
19

18 Punkte-System (Juristenausbildung)
<input pattern="[01]?[0-8]">

5
13
0,8
19

Datenschutz

Impressum