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) do
let 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 = “” then
extValue := null
else
extValue := substr(extValue, 0, length(extValue) - 1)
end;
extValue
end
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) do
let 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, grp) + “,”;
src := substr(src, idx + idxLen)
end
;
if extValue = “” then
extValue := null
else
extValue := substr(extValue, 0, length(extValue) - 1)
end;
extValue
end;
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) do
let extractedValue := "";
let idx := 0;
let idxLen := 0;
while testx(src, regex) do
idx := index(src, extractx(src, regex));
idxLen := length(extractx(substr(src, idx), regex));
extractedValue := extractedValue + if grp = "" then
if extractx(substr(src, idx), regex) != null then
extractx(substr(src, idx), regex) + "¶"
end
else
if extractx(substr(src, idx), regex, grp) != null then
extractx(substr(src, idx), regex, grp) + "¶"
end
end;
src := substr(src, idx + idxLen)
end
;
if extractedValue != "" then
extractedValue := substr(extractedValue, 0, length(extractedValue) - 1)
end;
if extractedValue != "" then
split(extractedValue, "¶")
else
null
end
end;
function gfnValidateFlags(flags : text) do
let validFlags := "";
if length(flags) != 0 then
for i in range(0, length(flags)) do
switch item(flags, i) do
case "i":
(validFlags := validFlags + "i")
case "m":
(validFlags := validFlags + "m")
case "s":
(validFlags := validFlags + "s")
case "u":
(validFlags := validFlags + "u")
end
end
end;
validFlags
end;
function gfnExtractxGFlags(src : text,regex : text,flags : text,grp : text) do
let extractedValue := "";
let validFlags := gfnValidateFlags(flags);
let idx := 0;
let idxLen := 0;
while testx(src, regex, validFlags) do
idx := 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 then
extractx(substr(src, idx), regex, validFlags, grp) + "¶"
end;
src := substr(src, idx + idxLen)
end
;
if extractedValue != "" then
extractedValue := substr(extractedValue, 0, length(extractedValue) - 1)
end;
if extractedValue != "" then
split(extractedValue, "¶")
else
null
end
end