Ich folgte der Idee von Mijoja und schöpfte aus den von JasonS aufgedeckten Problemen. Ich habe ein bisschen nachgesehen, bin mir aber nicht sicher, daher wäre eine Überprüfung durch jemanden, der mehr Experten als ich in js regex ist, großartig :)
var re = /(?=(..|^.?)(ll))/g
// matches empty string position
// whenever this position is followed by
// a string of length equal or inferior (in case of "^")
// to "lookbehind" value
// + actual value we would want to match
, str = "Fall ball bill balll llama"
, str_done = str
, len_difference = 0
, doer = function (where_in_str, to_replace)
{
str_done = str_done.slice(0, where_in_str + len_difference)
+ "[match]"
+ str_done.slice(where_in_str + len_difference + to_replace.length)
len_difference = str_done.length - str.length
/* if str smaller:
len_difference will be positive
else will be negative
*/
} /* the actual function that would do whatever we want to do
with the matches;
this above is only an example from Jason's */
/* function input of .replace(),
only there to test the value of $behind
and if negative, call doer() with interesting parameters */
, checker = function ($match, $behind, $after, $where, $str)
{
if ($behind !== "ba")
doer
(
$where + $behind.length
, $after
/* one will choose the interesting arguments
to give to the doer, it's only an example */
)
return $match // empty string anyhow, but well
}
str.replace(re, checker)
console.log(str_done)
meine persönliche Ausgabe:
Fa[match] ball bi[match] bal[match] [match]ama
Das Prinzip besteht darin, checker
an jedem Punkt in der Zeichenfolge zwischen zwei beliebigen Zeichen aufzurufen , wenn diese Position der Ausgangspunkt von:
--- jede Teilzeichenfolge von der Größe dessen, was nicht erwünscht ist (hier 'ba'
also ..
) (wenn diese Größe bekannt ist; sonst muss es vielleicht schwieriger sein, dies zu tun)
--- --- oder kleiner als das, wenn es der Anfang der Zeichenfolge ist: ^.?
und danach
--- was ist eigentlich zu suchen (hier 'll'
).
Bei jedem Aufruf von checker
wird ein Test durchgeführt, um zu überprüfen, ob der vorherige Wert ll
nicht dem entspricht, was wir nicht wollen ( !== 'ba'
). Wenn dies der Fall ist, rufen wir eine andere Funktion auf, und es muss diese ( doer
) sein, die die Änderungen an str vornimmt. Wenn der Zweck dies ist, oder allgemeiner, werden die erforderlichen Daten für die manuelle Verarbeitung eingegeben die Ergebnisse des Scannens vonstr
.
Hier ändern wir die Zeichenfolge, sodass wir den Längenunterschied verfolgen müssen, um die Positionen zu versetzen, die durch replace
alle berechnet werden str
und die sich selbst nie ändern.
Da primitive Zeichenfolgen unveränderlich sind, hätten wir die Variable verwenden können str
, um das Ergebnis der gesamten Operation zu speichern, aber ich dachte, das Beispiel, das bereits durch die Ersetzungen kompliziert wurde, wäre mit einer anderen Variablen klarer (str_done
) .
Ich denke, dass es in Bezug auf die Leistung ziemlich hart sein muss: all diese sinnlosen Ersetzungen von '' in '', this str.length-1
Zeiten, plus hier manuelles Ersetzen durch Macher, was viel Schneiden bedeutet ... wahrscheinlich in diesem speziellen obigen Fall, das könnte gruppiert werden, indem die Schnur nur einmal in Stücke geschnitten wird, um die wir sie einfügen [match]
und .join()
mit sich [match]
selbst verbinden möchten .
Die andere Sache ist, dass ich nicht weiß, wie es mit komplexeren Fällen umgehen würde, dh mit komplexen Werten für das falsche Aussehen ... die Länge ist vielleicht die problematischste Daten, die es zu bekommen gilt.
und checker
im Falle mehrerer Möglichkeiten von unerwünschten Werten für $ Behind müssen wir einen Test mit einem weiteren regulären Ausdruck (der zwischengespeichert (erstellt)) checker
ist, am besten durchführen, um zu vermeiden, dass dasselbe reguläre Ausdrucksobjekt erstellt wird bei jedem Aufruf checker
zu wissen, ob es das ist, was wir vermeiden wollen oder nicht.
hoffe ich war klar; Wenn nicht, zögern Sie nicht, ich werde es besser versuchen. :) :)