JSL REGEX-Wortgrenzen \ b<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo, -
Unterstützt JSL REGEX-Wortgrenzen? \ b?
Ich versuche, vollständige Wörter im Text mit PAT MATCH und dem Ausdruck "\ bword \ b" zu ersetzen. Aus irgendeinem Grund verarbeitet JSL \ b nicht, obwohl es \ W erkennt und verarbeitet. Leider ist \ W für meine Aufgabe nicht gut genug, da es keine Einträge mit einzelnen Wörtern unter den von ihm eingeführten Problemen gibt.
Beispiel:
a = "Fenster ist: offen";
p = pat regex ("\ bis \ b");
pat Übereinstimmung (a, p, "war");
Ich würde erwarten, dass es zurückkommt: a = "Fenster war: offen";
Vielen Dank! - Shaul
Re: JSL REGEX-Wortgrenzen \ bAh sehr gut. Viel besser danke. JMP10 hat eine vereinfachte Regex-Funktion, die das globale Ersetzen bewirkt:
Regex ("Hallo", "[aeiou]", "?", GLOBALREPLACE);
"? e ?? o"
RegexMatch () erfordert eine externe Schleife (das while () aus dem vorherigen Beispiel). PatMatch () kann einen Regex als Teil eines Musters verwenden, verwendet jedoch nicht die Rückverweise, außer innerhalb eines patRegex (). patMatch soll ein Muster mit den patXXXX-Funktionen anstelle der Regex-Sprache aufbauen. Es gibt verschiedene Möglichkeiten, partielle Übereinstimmungen zu erfassen.
Re: JSL REGEX-Wortgrenzen \ bIch habe die Regex mit \ W vereinfacht (JMP9 akzeptiert \ W):
x = "der große, sehr schnelle Fuchs";
a = Regex-Übereinstimmung (x, "(\ W | ^) (sehr) (\ W | $)", "\ 1fairly 3");
Druck (x);
Mein einziges verbleibendes Problem ist, dass der Austausch nur einmal durchgeführt wird. Daher brauche ich eine Schleife, bis keine Übereinstimmungen mehr zurückgegeben werden. Gibt es eine Flagge wie FULLSCAN, die ich in Regex Match angeben könnte? Ich konnte Pat Match aus irgendeinem Grund nicht zur Arbeit bringen.
Auf jeden Fall hast du mir schon sehr geholfen!
Re: JSL REGEX-Wortgrenzen \ bEingeklammerte Ausdrücke im regulären Ausdruck bilden eine Erfassungsgruppe, auf die anhand der Nummer verwiesen werden kann. Zähle nur die offenen Parens von links nach rechts, um die Nummer zu erhalten. Der von der Erfassungsgruppe übereinstimmende Text kann später in der Regex oder in der Ersetzungszeichenfolge als Rückwärtsreferenz verwendet werden. \ 1 ist eine Rückreferenz auf die erste Erfassungsgruppe.
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fair \ 3 ");
hat 3 offene Parens; Der mittlere Satz (um das passende Wort) wurde nicht wirklich benötigt, aber da sie dort sind, verwende ich \ 1 und \ 3 in der Ersetzungszeichenfolge. \ 0 bezieht sich auf das gesamte Spiel. Wenn Sie die Klammergruppen verschachteln, zählen Sie nur die geöffneten Parens von links nach rechts, um die Nummer zu erhalten.
Ich habe {4} Wiederholungen verwendet, um ein Beispiel zu erstellen, bei dem die Wörter mit drei und fünf Buchstaben im Quelltext nicht gefunden wurden. Möglicherweise benötigen Sie eine andere Möglichkeit, um das Wort anzugeben. Hier ist ein Beispiel, bei dem die Wörter einzeln abgehauen werden:
Drucken (JMP-Version ());
x = "der große, sehr schnelle Fuchs";
Während (1,
Ergebnisse = Regex-Übereinstimmung (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] +) ([^ a-zA-Z0-9_] | $)", "\ 1 \ 3");
Wenn (N Artikel (Ergebnisse)> = 3,
Druck (Ergebnisse [3]),
Brechen()
);
);
9.0.2
"das"
"groß"
"sehr"
"schnell"
"Fuchs"
In diesem Beispiel bedeutet "+" einen oder mehrere der vorherigen Ausdrücke. Daher benötigen Sie möglicherweise nicht die explizite Länge. RegexMatch gibt eine Liste von Rückverweisen zurück. Das erste Element in der Liste ist \ 0, was die gesamte Übereinstimmung darstellt. Ergebnisse [3] ist \ 2, was das übereinstimmende Wort ist. Die Ersetzung ist \ 1 \ 3, wodurch \ 2 aus der Zeichenfolge entfernt wird.
Es gibt eine Reihe von Websites mit Tutorials für Regex. Regular-Expressions.info - Regex-Tutorial, Beispiele und Referenz - Regexp-Muster , zum Beispiel.
JMP11 \ b vereinfacht die Beispiele erheblich.
Re: JSL REGEX-Wortgrenzen \ bDas ist sehr hilfreich, da ich immer noch bei JMP9 bin.
Ich muss das {n} basierend auf der übereinstimmenden Länge der Zeichenfolge dynamisch anpassen.
Können Sie näher erläutern, wie die Nummerierung von Substitutionen funktioniert? Ich bin nicht sicher, ob ich verstehe, was \ 1 und \ 3 tun?
Vielen Dank! - Shaul
Re: JSL REGEX-Wortgrenzen \ bJMP10 unterstützt die \ b-Wortgrenze in regulären Ausdrücken nicht. JMP11 wird. In den folgenden Beispielen bedeutet {4} 4 Vorkommen des vorherigen Zeichens, das mit dem 4-Buchstaben-Wort "very" übereinstimmen soll, indem die Wortgrenze zu jeder Seite gefordert wird. Die Funktion regexMatch interpretiert das 2. Argument als regulären Ausdruck und interpretiert das 3. Argument als Ersetzungstext mit Ersetzungen, die nach den erfassenden Klammergruppen (im zweiten Beispiel verwendet) nummeriert sind.
print (JMPVERSION ());
x = "der große, sehr schnelle Fuchs";
regexMatch (x, "\ b \ w {4} \ b", "ziemlich");
Druck (x);
11.0.0
"der große, ziemlich schnelle Fuchs"
JMP10 kann dies je nach Ihren Anforderungen gut genug tun, indem Sie die Trennzeichen erfassen und sie wieder in die Ersetzung einfügen:
print (JMPVERSION ());
x = "der große, sehr schnelle Fuchs";
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fair \ 3 ");
Druck (x);
10.0.1
"der große, ziemlich schnelle Fuchs"
\ b ist ein schwer zu unmögliches Muster, das geschrieben werden muss, da es vor und nach einem Wort passen muss und trotzdem mit keinem Text übereinstimmt. Das Wort kann ganz am Anfang (^) oder ganz am Ende ($) von stehen der Text. Im zweiten Beispiel wird die Anforderung "Kein Text abgleichen" verwendet, indem die Klammergruppen \ 1 und \ 3 im Ersetzungstext verwendet werden.