Hello,
how to build an expression rule which has 2 inputs - 1 is string, 2nd is alphabet. print the count of characters matching alphabet with the string
(Umbrella to expected Result -u1m1b1r1e1l2a1)
Discussion posts and replies are publicly visible
Try this expression, it should work for you assuming you want to only return the first instance (with count) of each character. E.g., "Caterpillar" = "c1a2t1e1r2p1i1l2".
a!localVariables( local!alphabet: "abcdefghijklmnopqrstuvwxyz", local!input: "Umbrella", local!inputArray: a!forEach( items: 1+enumerate(len(local!input)), expression: lower(charat(local!input,fv!index)) ), local!chars: union(local!inputArray,local!inputArray), joinarray( reject( fn!isnull, a!forEach( items: local!chars, expression: if( find(fv!item,local!alphabet,1)>0, concat( fv!item, count(wherecontains(fv!item,local!inputArray)) ), null ) ) ) ) )
Thank you. this works
Chris, Can you please give the high level of the code design which you have given. So that it can be clear.
Sure, basically here we are splitting the input string into an array, utilizing union() to remove duplicate characters, and creating a string of each unique character plus the count of appearances in the original input. Adding some comments as well:
a!localVariables( local!alphabet: "abcdefghijklmnopqrstuvwxyz", /* input for which letters to consider */ local!input: "Umbrella", /* string to evaluate */ /* split the input string into an array of characters u-m-b-r-e-l-l-a */ local!inputArray: a!forEach( items: 1+enumerate(len(local!input)), expression: lower(charat(local!input,fv!index)) ), local!chars: union(local!inputArray,local!inputArray), /* array of unique characters only u-m-b-r-e-l-a */ joinarray( /* combine forEach array into a single string */ reject( fn!isnull, /* remove values not included in the input string */ a!forEach( items: local!chars, /* loop unique characters */ expression: if( find(fv!item,local!alphabet,1)>0, /* is this character in the alphabet string to consider? */ concat( /* combine */ fv!item, /* current character */ count(wherecontains(fv!item,local!inputArray)) /* number of appearances */ ), null ) ) ) ) )
Thank you Chris.