2016-05-05 11 views
2

Ich habe diese Regex in Javascript:Regex Lookbehind js

0x[A-F0-9]{2}\g 

Ich mag würde, dass ändern, um ein Spiel zu erhalten, wenn das vorherige Zeichen nicht ein \ IST. So etwas:

  • 0x60 -> true
  • \0x60 -> false

kam ich mit so etwas, aber es funktioniert nicht richtig:

[^\\]0x[A-F0-9]{2}\g 

Es passt ALLES außer \, wo mit ALLES meine ich:

  • a0x50 -> true, darunter "eine"
  • _0x50 -> true, einschließlich "_"
  • ...
  • \0x50 -> false

Regex Beispiel: regex101, gefolgt von einem Plnkr.

Ist das möglich? Danke.

+0

Lookbehind derzeit in JavaScript wird nicht unterstützt – ndugger

+2

Haben Sie etwas zu erreichen oder ersetzen? –

Antwort

1

Der wichtigste Punkt ist das Muster passen würden Sie normalerweise eine negative Lookbehind in eine optionale Erfassungsgruppe setzen in, und dann prüfen, ob die Gruppe abgestimmt. Wenn dies der Fall ist, brauchen Sie das Match nicht, sonst verwenden Sie es.

Wenn Sie zu sammeln und gewinnen Substrings verwenden

var re = /(\\?)0x[A-F0-9]{2}/gi; 
 
var str = '\\0x50 0x60 asdasda0x60'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
\t if (!m[1]) { 
 
    \t res.push(m[0]); 
 
    } 
 
} 
 
document.body.innerHTML = "TEST: " + str + "<br/>"; 
 
document.body.innerHTML += "RES: " + JSON.stringify(res,0,4) + "<br/>";

Wenn Sie benötigen ersetzen nur die Zeichenfolgen, die keine \ vor dem 0x.. haben, verwenden ein Rückruf innerhalb der replace Methode, um zu überprüfen, ob Gruppe 1 übereinstimmt. Wenn dies der Fall ist, ersetzen Sie es durch das ganze Spiel, und wenn nicht, ersetzen Sie es einfach mit dem Muster, das Sie brauchen.

var re = /(\\?)0x[A-F0-9]{2}/gi; 
 
var str = '\\0x50 0x60 asdasda0x60'; 
 
var res = str.replace(re, function(m, group1){ 
 
\t return group1 ? m : "NEW_VAL"; 
 
}); 
 
document.body.innerHTML = "TEST: " + str + "<br/>"; 
 
document.body.innerHTML += "RES: " + res + "<br/>";

+1

Dies ist. Vielen Dank für deine Hilfe, Subscrings zu finden und zu sammeln war genau das, was ich brauchte. Hier ist ein Arbeits-PLNKR mit Ihrer Lösung: https://plnrkr.co/edit/KA1i5aXPVfvSBsSXeZ90 – Dyd666

1

JavaScript nicht unterstützt Lookbehinds, und wie Sie bereits folgendes vorgeschlagen wird ein zusätzliches Zeichen (das Zeichen vor 0x) verbrauchen bis:

/[^\\]0x[A-F0-9]{2}/g 

Sie können wie einige hässliche Hacks tun:

'\\0x25 0x60'.match(/([^\\]|^)0x[A-F0-9]{2}/g).map(function(val) { 
    return val.slice(1); 
}); 
['0x60'] 

, die das führende Zeichen verbrauchen, aber es durch eine Iteration über das Übereinstimmungsarray entfernen.

Dies jedoch macht Eingaben wie 0x600x60 geben ['0x60'] statt ['0x60', '0x60']

+0

JS ist etwas durcheinander Junk .. – sln

1

Sie beide könnten die schlechten und die guten entsprechen.
Dies würde es auf die gute ausgerichtet halten, so dass Sie keine verpassen würden.

(?:\\0x[A-F0-9]{2}|(0x[A-F0-9]{2}))

In diesem Fall ist nur die gute Show up in Capture-Gruppe 1.

(?: 
     \\ 0x [A-F0-9]{2}  # Bad 
    | 
     (0x [A-F0-9]{2}) # (1), Good 
) 
0

Dies wird es tun:

(?:[^\\]|^)0x[A-F0-9]{2} 

var myregexp = /(?:[^\\]|^)0x[A-F0-9]{2}/mg; 
 
var subject = '0x60 \0x99 0x60 \0x99 0x60 0x60'; 
 
var match = myregexp.exec(subject); 
 
while (match != null) { 
 
\t for (var i = 0; i < match.length; i++) { 
 
\t \t document.body.innerHTML += match[i]+ "<br/>"; 
 
\t } 
 
\t match = myregexp.exec(subject); 
 
}


Regex Erläuterung:

(?:[^\\]|^)0x[A-F0-9]{2} 

Match the regular expression below «(?:[^\\]|^)» 
    Match this alternative (attempting the next alternative only if this one fails) «[^\\]» 
     Match any character that is NOT the backslash character «[^\\]» 
    Or match this alternative (the entire group fails if this one fails to match) «^» 
     Assert position at the beginning of a line (at beginning of the string or after a line break character) (line feed, line feed, line separator, paragraph separator) «^» 
Match the character string “0x” literally (case insensitive) «0x» 
Match a single character present in the list below «[A-F0-9]{2}» 
    Exactly 2 times «{2}» 
    A character in the range between “A” and “F” (case insensitive) «A-F» 
    A character in the range between “0” and “9” «0-9» 
0

Sie sind im Glück, wenn Sie Knoten verwenden, oder bereit sind, auf einem Browser-Flag aktivieren (aus here):

Lookbehind Behauptungen derzeit in einem sehr frühen Stadium des TC39-Spezifikationsprozesses. Da sie eine so offensichtliche Erweiterung der RegExp-Syntax darstellen, haben wir uns entschieden, ihre Implementierung zu priorisieren. Sie können bereits mit Lookbehind-Assertionen experimentieren, indem Sie V8 Version 4.9 oder höher mit --harmony ausführen oder indem Sie in Chrome ab Version 49 experimentelle JavaScript-Funktionen (Verwendung von about: flags) aktivieren.

Jetzt natürlich ist es nur

/(?<!\\)0x[A-F0-9]{2}/g 

Es gibt auch andere Ansätze für Lookbehinds in diesem answer simuliert. Mein Favorit ist die Umkehrung der Saite und die Verwendung eines Lookaheads.

var re = /[A-F0-9]{2}x0(?!\\)/g; 
 
var str = "0x60 \0x33"; 
 

 
function reverse(s) { return s.split('').reverse().join(''); } 
 

 
document.write(reverse(str).match(re).map(reverse));