Reguläre Ausdrücke gesucht, float und %-Angabe



  • Hallo @all,

    ich hoffe ihr könnt mir bei dem folgenden Problem helfen:

    1. Ich suche einen regulären Ausdruck der in der Lage ist nur auf Strings zu matchen, die folgendermaßen aussehen:

    - eine beliebig lange Zahl + dann möglicherweise ein Punkt oder ein Komma + dann wieder eine beliebig lange Zahl (nur gültig, wenn davor ein Punkt oder Komma stand)

    Matche bei:
    500
    3.5665
    0.345
    44,345

    nicht aber bei:
    00.4545
    ,34
    0.343.34

    Die Abfrage möchte ich nutzen um eine Fließkommazahl (im Speziellen eine Flächenangabe) abzufangen.

    2. Außerdem benötige ich einen regulären Ausdruck um für eine Prozentangabe die korrekten Werte zu filtern:

    Matche bei:
    0.452
    12,45
    100.00
    100
    99,34234

    Nicht aber bei:
    100.43
    2,34.34

    😕



  • ^\d+((\.|\,)\d+)?$
    


  • Ok danke, ich musste \d durch [0-9] ersetzen, dann funktioniert es wunderbar.

    Wie sieht es mit der 2. Variante aus, kann man es forcieren, dass gebrochene Prozentwerte über 100 nicht ausgegeben werden? 😕



  • Hi,

    ^\d{1,2}((\.|,)\d+)?$|^100((\.|,)0+)?$
    

    cu, Bernd



  • Hi Bernd,

    vielen Dank...funktioniert auch super.

    Nun hab ich noch ein Problem:

    Ich brauche einen regulären Ausdruck der in der Lage ist alle Jahreszahlen abzufangen, die genau 4 Ziffern beinhalten und wo die Jahreszahl gleich oder kleiner gleich dem aktuellen Jahr ist:

    Meine Versuche:

    Beispiel, Daten bis 1997:
    ^((0|1)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7)){1,4}$

    Beispiel, Daten bis 2007:
    ^((0|1|2)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7)){1,4}$

    Gibt es da eine Art Vergleichsfunktion so nach dem Motto:
    Zahl1<=Zahl2 ???

    Wie geht man da am besten ran? Ich würde die aktuelle Jahreszahl auslesen und könnte diese beliebig in die einzelnen 4 Ziffern parsen, danach könnte ich den regulären Ausdruck in einer Schleife formatieren.

    😕



  • Hi,

    Gibt es da eine Art Vergleichsfunktion so nach dem Motto:
    Zahl1<=Zahl2 ???

    sowas geht M.E mit RegExp nicht.

    Nimm hier vielleicht einfach "^\d{4}$", teste ob das matched und falls ja wandle das in eine Zahl und vergleiche diese mit dem aktuellen Jahr.

    Beispiel, Daten bis 1997:
    ^((0|1)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7)){1,4}$

    Das funktioniert so nicht, Du brauchst hier eher was wie (ungetestet)

    0000 - 0999 oder 1000 - 1899 oder 1900 - 1989 oder 1990 - 1997:

    ^(0[0-9]{3}|1[0-8][0-9]{2}|19[0-8][0-9]|199[0-7])$
    

    cu, Bernd



  • Hey Bernd,

    kann man das auch noch soweit verallgemeinern, dass man damit einen Algorithmus erstellen kann, so dass jeweils bis zum aktuellen Jahr (derzeit 2007) aber auch die kommenden Jahre der reguläre Ausdruck gültig ist?

    Sprich die einzelnen Feldbereiche [0-8] etc. durch die Programmlogik zu befüllen.

    Kurz zum Hintergrund, ich möchte das programmiertechnisch umsetzen und dafür gibt es eine Klasse die bestimmte Eingaben in ein Eingabefeld anhand eines regulären Ausdrucks begrenzt. So wäre es möglich, dass keine Fehleingaben durch den Benutzer gemacht werden können bzw. diese sofort farblich hervorgehoben werden.

    Man müsste versuchen das Problem soweit zu abstrahieren, dass man eine gültige abzuarbeitende Regel bekommt, die ich dann mit geeigneten for-Schleifen etc. zur Formatierung des reglären Ausdrucks nutzen kann.

    Vielleicht hast du da ja einen Vorschlag? 😕



  • Hallo,

    warum willst Du Dir das antun ? Nimm Doch einfach was wie:

    re.Pattern = "^\d{4}$"
    re.Match(strData) && atoi(strdata) >= AktuellesJahr

    cu, Bernd


Anmelden zum Antworten