index_of mit Position

Hallo,

eigentlich gibt es die index_of-Abfrage mit dem Parameter der Position - will sagen: Wenn in einem string ein substring mehrfach vorkommt, findet man dessen verschiedene Positionen durch den Zusatz ", 1", ", 2" usw.


Beispiel: (Quelle):

For example, "abcabc"?index_of("bc") will return 1 (don't forget that the index of the first character is 0). Also, you can specify the index to start the search from: "abcabc"?index_of("bc", 2) will return 4.


Leider wird dieser Parameter in Synesty aber ignoriert, oder mache ich was falsch? Mein String ist z.B. in der Spalte "Categories", dort steht z.B. "16-303-304", die Abfrage ${Categories!?index_of("-",2)} ergibt aber 2, nicht 6.


Liebe Grüße, Podolsky


Mit ${"16-303-304"!?index_of("-",3)} kommt 6 raus.


Man muss aufpassen, da die Zählung bei 0 beginnt. D.h. bei 3 heisst es: beginne nach dem ersten Bindestrich, also ab der 4. Position. Bildlich steht der Cursor, ab dem gesucht wird, bei 3 rechts neben dem ersten Bindestrich.


Okay, dann hatte ich die ganze Sache mißverstanden. Ich hatte gehofft, daß der Index die Position des xten Vorkommens des gesuchten Substrings im String zurückgibt. Also auf Deutsch: Wenn ich wissen will, an welcher Position das "-" zum 7. Mal vorkommt, hatte ich gedacht, daß mir index_of("-",7) genau das liefert (z.B. index_of("1-2-3-4-5-6-7-", 7) sollte 14 ergeben (Position nach der 7, weil siebtes Vorkommen von "-"). Aber jertzt, da ich darüber nachdenke, ist es mir klar - die Formel heißt ja index_of und nicht position_of :-) Gibt es irgendeine Formel für das, was ich möchte? Es ist extrem aufwendig, das ansonsten mit verschachtelten Substrings von Substrings und index_of-Werten zu berechnen.


Danke und Gruß, Podolsky

Noch ein Nachtrag: Ich habe das hier gefunden - das wäre genau, was ich suche. Gibt es sowas in Freemarker, oder kann ich es irgendwie anders einsetzen?


Auszug:

ordinalIndexOf

public static int ordinalIndexOf(String str,
                                 String searchStr,
                                 int ordinal)

Finds the n-th index within a String, handling null. This method uses String.indexOf(String).

...

StringUtils.ordinalIndexOf("aabaabaa", "b", 2)  = 5

Leider ist uns keine Freemarker Funktion bekannt, die diese Funktion umsetzt. Sie könnten sich eine eigene Funktion schreiben. Diese könnte wie folgt aussehen:

<#function position_of string char pos><#if !string?contains(char)><#return -1></#if><#assign str = string><#list 1..(pos-1) as i><#assign str = str ?replace("-","#","f")></#list><#return str?index_of("-") /></#function>
${position_of("1-2-3-4-5-6-7-", "-", 7)} 



Vielen Dank für den Ansatz! Da wir fast zeitgleich geschrieben hatten, glaube ich, daß Ihre Antwort meinem vorletzen Beitrag gilt - können Sie noch was zu den StringUtils sagen, kann man die irgendwie nutzen?

Auf die StringUtils kann man nicht direkt aus Freemarker zugreifen. Wir prüfen mal, ob wir das über eine neue Template-Funktion ermöglichen können. Falls es geht, packen wir es mit auf die Wunschliste.

Wir haben es geprüft. Wir werden eine neue Funktion position_of zur Verfügung stellen. Diese liefert das gleiche Ergebnis wie

ordinalIndexOf aus den Apache Commons StringUtils.


Vermutlich wird es so aussehen:


Position of the 2nd occurence of "-" is ${position_of("1-2-3-4", "-",2)}


Ergebnis: Position of the 2nd occurence of "-" is 3


Wir versuchen es im Laufe der kommenden Woche mit rein zu bekommen.

Die neue Funktion position_of ist jetzt verfügbar.

${position_of("1-2-3-4", "-",2)}


Ergebnis: 3


Beispiel:

image