Problemumgehung für das extractx() “g” flag
Hier ist eine grundlegende UDF zum extrahieren aller werte, die einem regex muster entsprechen...
function extractxg(src : text,regex : text) dolet extValue := “”;let idx := 0;let idxLen := 0;while testx(src, regex) do idx := index(src, extractx(src, regex));idxLen := length(extractx(substr(src, idx), regex));extValue := extValue + extractx(substr(src, idx), regex) + “,”;src := substr(src, idx + idxLen)end;if extValue = “” thenextValue := nullelseextValue := substr(extValue, 0, length(extValue) - 1)end;extValueend
Anhand dieses beispiels...
let myVar := “a23B65nm87”;extractxg(myVar, “\D+”)
a,B,nm wird als verketteter string zurückgegeben.
7 Antworten
-
Hallo Sean,
sehr interessant. Wäre in diesem Fall nicht einfacher gewesen den string mit splitx aufzuteilen?
concat(splitx(YOURSOURCE, “\d+”))
Leo
-
Hallo Leo,
Das war ein einfaches beispiel. Versuchen sie, die autoren der beiträge mit Ihrer methode aus dem quellcode dieser seite zu extrahieren, ohne die namen zu kennen
. Hier ist der code für meine methode...
function extractxg(src : text,regex : text,grp : text) dolet extValue := “”;let idx := 0;let idxLen := 0;while testx(src, regex) doidx := index(src, extractx(src, regex));idxLen := length(extractx(substr(src, idx), regex));extValue := extValue + extractx(substr(src, idx), regex, grp) + “,”;src := substr(src, idx + idxLen)end;if extValue = “” thenextValue := nullelseextValue := substr(extValue, 0, length(extValue) - 1)end;extValueend;extractxg(“HTML Source”, “<div class=”“p-forum--post--author”“>\s+(.+)”, “$1”) -
Beeindruckend, Ich werde nachher ausprobieren. Habe ein ähnlichen Fall. Was genau macht $1 hier?
-
$1 ist die Erfassungsgruppe. Es enthält den Wert in Klammern (.+).
Ich habe ein Update für die Funktion extractx() angefordert, damit das Flag “g” funktioniert, aber Frank scheint nicht dazu geneigt zu sein.
Wie Sie wissen, funktionieren Links in neuen Posts nicht, aber Sie können den Thread finden.
Grüße,
Sean -
Großartiger Workaround! Gratuliere :-)
-
Danke schön :)
-
Gerade aktualisierte Versionen. Ich habe Funktionsnamen mit "gfn" vorangestellt, um globale Funktionen zu beschreiben. Wie die Namen andeuten, erlaubt "NoFlags" keine Flags und "Flags" erfordert Flags.
function gfnExtractxGNoFlags(src : text,regex : text,grp : text) dolet extractedValue := "";let idx := 0;let idxLen := 0;while testx(src, regex) doidx := index(src, extractx(src, regex));idxLen := length(extractx(substr(src, idx), regex));extractedValue := extractedValue + if grp = "" thenif extractx(substr(src, idx), regex) != null thenextractx(substr(src, idx), regex) + "¶"endelseif extractx(substr(src, idx), regex, grp) != null thenextractx(substr(src, idx), regex, grp) + "¶"endend;src := substr(src, idx + idxLen)end;if extractedValue != "" thenextractedValue := substr(extractedValue, 0, length(extractedValue) - 1)end;if extractedValue != "" thensplit(extractedValue, "¶")elsenullendend;function gfnValidateFlags(flags : text) dolet validFlags := "";if length(flags) != 0 thenfor i in range(0, length(flags)) doswitch item(flags, i) docase "i":(validFlags := validFlags + "i")case "m":(validFlags := validFlags + "m")case "s":(validFlags := validFlags + "s")case "u":(validFlags := validFlags + "u")endendend;validFlagsend;function gfnExtractxGFlags(src : text,regex : text,flags : text,grp : text) dolet extractedValue := "";let validFlags := gfnValidateFlags(flags);let idx := 0;let idxLen := 0;while testx(src, regex, validFlags) doidx := index(src, extractx(src, regex, validFlags, "$0"));idxLen := length(extractx(substr(src, idx), regex, validFlags, "$0"));extractedValue := extractedValue + if extractx(substr(src, idx), regex, validFlags, grp) != null thenextractx(substr(src, idx), regex, validFlags, grp) + "¶"end;src := substr(src, idx + idxLen)end;if extractedValue != "" thenextractedValue := substr(extractedValue, 0, length(extractedValue) - 1)end;if extractedValue != "" thensplit(extractedValue, "¶")elsenullendend
Content aside
- vor 3 JahrenZuletzt aktiv
- 7Antworten
- 959Ansichten
