Ich habe mit regulären Ausdrücken für Dominion Land Surveyor (DLS) -Standorte gespielt. Ich möchte, dass dieses Format beim Keyup-Ereignis eines HTML-Eingabetextfelds erzwungen wird. Daher versuche ich, dies über jQuery und Javascript zu tun.

Das Format lautet: xx-xx-xxx-xxWx

wo
-die ersten beiden x können zwischen 01 und 16 liegen
-Der Bindestrich ist ein Bindestrich
-die nächsten zwei x können zwischen 01 und 36 liegen
-die nächsten drei x können zwischen 001 und 127 liegen
-die nächsten zwei x können zwischen 01 und 34 liegen
-das W ist ein Wt
-Das letzte x kann zwischen 1-8

liegen Mit regexpal.com konnte ich bestätigen, dass der Ausdruck:

^(0[1-9]|1[0-6])[/-](0[1-9]|1[0-9]|2[0-9]|3[0-6])[/-](0[0-9][1-9]|1[0-1][0-9]|1[2][0-7])[/-](0[1-9]|1[0-9]|2[0-9]|3[0-4])[W][1-8]$

Dies funktioniert so, wie ich es möchte, aber ich kann die Syntaxfehler nicht überwinden, wenn ich versuche, dies in meine jQuery-Ersetzungsmethode zu integrieren. Ich habe den regulären Ausdruck nur so geändert, dass er einen Schrägstrich am Anfang und am Ende enthält.

Hier ist die Methode, die ich beim Keyup-Ereignis ausführen möchte:

function LsdLocation(obj) {
   var value = obj.val();
   var regex = /^(0[1-9]|1[0-6])[/-](0[1-9]|1[0-9]|2[0-9]|3[0-6])[/-](0[0-9][1-9]|1[0-1][0-9]|1[2][0-7])[/-](0[1-9]|1[0-9]|2[0-9]|3[0-4])[W][1-8]$/;
   value = value.replace(regex, '');
   obj.val(value);
}

Jede Hilfe wäre sehr dankbar!

0
BeeDub5 11 Dez. 2013 im 03:16

3 Antworten

Beste Antwort

Hier ist eine in sich geschlossene Antwort (nicht jquery).

Siehe Kommentare im Code.

Der Eingabewert wird nicht gelöscht.

Stattdessen wird eine Hintergrundfarbenrückmeldung bereitgestellt, wenn der Benutzer der Eingabe gültiger Daten näher kommt.

Der folgende Code ist auch als DominionLandSurveyor.js verfügbar

Vielen Dank an @sln für die inkrementelle Regexp-Idee.

// My answer for
// http://stackoverflow.com/questions/20507396/regular-expression-for-dominion-land-surveyor/20508597?noredirect=1#comment30663755_20508597
// Use it in Firefox Scratchpad or Google Chrome devtools Snippets.
 /* jslint browser: true */
 /*global console: false*/
     'use strict';
(function testDominionLandSurveyor() {
    var inp = document.body.appendChild(document.createElement('input'));
    inp.type = 'text';
    inp.value = '01-01-001-01W1';
    inp.title = 'e.g. 16-36-127-34W8';
    inp.onkeyup = function LsdLocation(obj) {
        var value = obj.target.value;
        // Based on idea by sln in http://stackoverflow.com/a/20508410/743358
        // Match incrementally, producing ever more subexpression matches until fully matched.
        var regex = /^(?:(0(?:[1-9])?|1(?:[0-6])?)(?:-(?:(0(?:[1-9])?|1(?:[0-9])?|2(?:[0-9])?|3(?:[0-6])?)(?:-(?:(0(?:[0-9](?:[1-9])?)?|1(?:[0-1](?:[0-9])?)?|1(?:[2](?:[0-7])?)?)(?:-(?:(0(?:[1-9])?|1(?:[0-9])?|2(?:[0-9])?|3(?:[0-4])?)(?:W(?:([1-8]))?)?)?)?)?)?)?)?)$/;
        var matches = regex.exec(value);
        console.log(matches);
        if (matches) {
            var unmatched = matches.filter(function(value) {
                return value === undefined;
            });
            console.log(unmatched);
            obj.target.style.backgroundColor = 'hsl(360,100%,'
            // Increase luminance with each component match, up to white.
            + (100 - 8 * unmatched.length) + '%)';
            console.log(obj.target.style.backgroundColor);
        } else {
            obj.target.style.backgroundColor = 'red';
        }
    // obj.target.value = value;
    };
})();
0
stackunderflow 16 Dez. 2013 im 22:31

Ich bin mir nicht sicher, aber ein Key-Up-Ereignis sieht so aus, als ob eine teilweise Übereinstimmung gültig ist.
Bei Annahme muss das gesamte Formular als vollständiger Validierungs-Regex vorhanden sein.

Seine wählerische, aber eine Randbedingung (teilweise Übereinstimmung) folgt einem einfachen Konzept eines
progressive (rollende) optionale Übereinstimmungssequenz, immer von EOS beendet,
Ende der Zeichenfolge. Jedes optionale Segment muss seine erste Ebene (Zeichen) als
haben nicht optional.

Scheint ein rekursives Algo zu sein, das wahrscheinlich beim Parsen des regulären Ausdrucks
durchgeführt werden könnte (wenn Sie diese Dinge entwickeln).

Hier ist ein Beispiel:
Bearbeiten - Dieser Regex mag groß aussehen, hat aber eine Ausstoßgeschwindigkeit pro Sekunde, die viel schneller ist als der Puffer der Tastaturelektronik-Software.

 #  /^(0(?:[1-9]|$)|1(?:[0-6]|$))(?:-(?:(0(?:[1-9]|$)|[12](?:[0-9]|$)|3(?:[0-6]|$))(?:-(?:(0(?:[0-9](?:[1-9]|$))?|1(?:[0-1](?:[0-9]|$))?|1(?:[2](?:[0-7]|$))?)(?:-(?:(0(?:[1-9]|$)|[12](?:[0-9]|$)|3(?:[0-4]|$))(?:W(?:[1-8]|$))?)?)?)?)?)?)?$/

 ^           # BOS - Key pressed, if its a printable character, has to be 0 or 1 here 
 (
      0
      (?: [1-9] | $ )   # EOS
   |  1
      (?: [0-6] | $ )   # EOS
 )
 (?:        # The rest are optional
      -
      (?:
           (
                0
                (?: [1-9] | $ )   # EOS
             |  [12] 
                (?: [0-9] | $ )   # EOS
             |  3
                (?: [0-6] | $ )   # EOS
           )
           (?:
                -
                (?:
                     (
                          0
                          (?:
                               [0-9] 
                               (?: [1-9] | $ )   # EOS
                          )?
                       |  1
                          (?:
                               [0-1] 
                               (?: [0-9] | $ )   # EOS
                          )?
                       |  1
                          (?:
                               [2] 
                               (?: [0-7] | $ )   # EOS
                          )?
                     )
                     (?:
                          -
                          (?:
                               (
                                    0
                                    (?: [1-9] | $ )   # EOS
                                 |  [12] 
                                    (?: [0-9] | $ )   # EOS
                                 |  3
                                    (?: [0-4] | $ )   # EOS
                               )
                               (?:
                                    W
                                    (?: [1-8] | $ )   # EOS
                               )?
                          )?
                     )?
                )?
           )?
      )?
 )?
 $   # EOS
0
11 Dez. 2013 im 00:54

Ich habe mir diesen regulären Ausdruck ausgedacht. Könnte für Ihr Projekt nützlich sein. Lassen Sie mich wissen, wenn Sie Verwirrung haben. Bitte folgen Sie dem Link

var regex = /^((?:([S][E])|(?:[S][W])|(?:[N][W])|(?:[N][E]))(?:(0(?:[1-9])?|1(?:[0-9])?))(?:-(?:(0(?:[1-9])?|1(?:[0-9])?|2(?:[0-9])?|3(?:[0-6])?)))(?:-(?:(0(?:[1-9])?|1(?:[0-9])?|2(?:[0-9])?|3(?:[0-6])?)))(?:-(?:W(?:(0([1-8]))|[1-8])?|((0([1-8]))|[1-8])?)?)?)$/;
0
Hardik Soni 5 Okt. 2017 im 20:26