Frage zu Regular Expressions

  • N'Abend, eine Frage zu Regular Expressions in die Runde. In einem Perl Skript prüfe ich wie folgt den Parameter --warning auf Gültigkeit. Gültige Parameter sind drei 1 bis 10 stellige Zahlen, jeweils durch Komma getrennt; diese 3 Zahlen sind erforderlich. Jetzt soll eine 4 und 5 optionale Zahl, ebenfalls durch Komma getrennt, hinzukommen. Wie kann man das elegant lösen? Einfach ",([0-9]{1,}" erfordert stets das Komma.


    Code
    if ($warningLimits =~ /^([0-9]{1,10}),([0-9]{1,10}),([0-9]{1,10})$/) {
        # some 08/15 code ...
    }


    Gruß,
    sigma7

    Passively Cooled VDR: VDR 1.4.4, Debian Etch, Dynamic CPU Frequency, EPIA MII-12000, TT FF DVB-S 1.5, TT Budget DVB-S 1400, AVBoard 1.3, Philips SBC RU 760

  • Moin,


    wie wärs mit:


    Code
    if ($warningLimits =~ /^(\d{1,10}),(\d{1,10}),(\d{1,10})(,(\d{1,})|)(,(\d{1,})|)$/) {
       #foo
    }



    Gruß
    blafasel

    Produktiv:
    HW: Zalman HD 160 HTPC ° Intel Core i7-7700K ° 32 GB RAM ° 32TB HDDs ° 2x Digital Devices DuoFlex C2/T2 ° 4x Digital Devices DuoFlex-CT
    SW: yavdr 0.6.1 ° Kernel 4.4.0-96 ° VDR 2.2.0
    VDR-User #72 / Follow me on Twitter

  • Zitat

    Original von sigma7
    Einfach ",([0-9]{1,}" erfordert stets das Komma.


    Code
    (,[0-9]{1,10})*


    Sollte doch gehen, oder gilt das "*" nicht in den Perl-RegEx?

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Originally posted by knebb


    Code
    (,[0-9]{1,10})*


    Sollte doch gehen, oder gilt das "*" nicht in den Perl-RegEx?


    Geht schon, nur ist dann $4 inkl. Komma.


    -- sigma7

    Passively Cooled VDR: VDR 1.4.4, Debian Etch, Dynamic CPU Frequency, EPIA MII-12000, TT FF DVB-S 1.5, TT Budget DVB-S 1400, AVBoard 1.3, Philips SBC RU 760


  • Die zusätzlichen Klammern sind eine Idee ... Aber warum die Pipe Symbole?

    Passively Cooled VDR: VDR 1.4.4, Debian Etch, Dynamic CPU Frequency, EPIA MII-12000, TT FF DVB-S 1.5, TT Budget DVB-S 1400, AVBoard 1.3, Philips SBC RU 760

  • Zitat

    Original von sigma7
    Geht schon, nur ist dann $4 inkl. Komma.


    Naja, das "," sollte sich doch in Perl schnell wegeditieren lassen, oder?

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Originally posted by sigma7


    Die zusätzlichen Klammern sind eine Idee ... Aber warum die Pipe Symbole?


    Die Pipe ist ein "oder". Erwartet wird also entweder "ein Komma und eine Zahl", oder "nichts".

    Produktiv:
    HW: Zalman HD 160 HTPC ° Intel Core i7-7700K ° 32 GB RAM ° 32TB HDDs ° 2x Digital Devices DuoFlex C2/T2 ° 4x Digital Devices DuoFlex-CT
    SW: yavdr 0.6.1 ° Kernel 4.4.0-96 ° VDR 2.2.0
    VDR-User #72 / Follow me on Twitter

    Einmal editiert, zuletzt von blafasel ()

  • Kurzer schuss ins blaue: Hat Getopts zw. Longopts da keine option für ?

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

    2 Mal editiert, zuletzt von pinky666 ()

  • mit 'awk' geht's so:


    und liefert diese Indices (die ich mit '*' gekennzeichnet habe sind fuer dich relevant)

    Code
    --> 2,3,4,5,6
    *--> 2
    *--> 3
    *--> 4
    --> ,5
    *--> 5
    --> ,6
    *--> 6


    die Regexp sollte in Perl genauso ausschauen

  • Moin moin,


    ich hätte da noch folgenden Vorschlag:


    Code
    if ($warningLimits =~ /^(\d{1,10})(,\d{1,10}){2,4}$/) {
       #foo
    }


    Gruß


    Merten

    SilverStone SST-LC10B-E mit Kram drin damit läuft.
    yaVDR 0.4

  • Wenn das Komma nicht mit drin sein soll, muss die RegExp so aussehen:


    Code
    /^(\d{1,10}),(\d{1,10}),(\d{1,10})(?:,(\d{1,10}))?(?:,(\d{1,10}))?$/


    (?:XXX) gruppiert ohne sich den Inhalt zu merken.

    ----------------------------------------------------------------------------------------
    Hermes 651, Celeron 2GHz, 256MB, 40GB intern, 450GB per NFS, TT rev1.6
    gentoo, Kernel 2.6.3, VDR 1.2.6, bitstreamout, TBEs VDR Extension Board

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!