Difference between revisions of "SubStringLastIndex"

From Second Life Wiki
Jump to navigation Jump to search
m (More obvious this way (avoids the negative index issue), since we evaluate from right to left, the recursion should happen before the parameters for the add are pushed onto the stack.)
(Sasun's original version worked. The untested modification didn't. Added a 3rd tested solution.)
Line 34: Line 34:


'''Code:'''
'''Code:'''
Alternative implementation - may be faster, but untested.
Alternative implementation - may be faster, tested.


''(warning: uses recursion, high potential for LSL stack heap collision when processing large and/or highly repetitive strings)''
''(warning: uses recursion, high potential for LSL stack heap collision when processing large and/or highly repetitive strings)''
Line 42: Line 42:
         return 0;
         return 0;
     integer index = llSubStringIndex(vStrSrc, vStrTst);
     integer index = llSubStringIndex(vStrSrc, vStrTst);
     if (index == -1) //found, look again
    integer index2;
         return -1;
     if (index != -1) //found, look again
    return index + 1 + uSubStringLastIndex(llDeleteSubString(vStrSrc, 0, index), (vStrSrc = vStrTst = "") + vStrTst);
         index2 = uSubStringLastIndex(llGetSubString(vStrSrc, index + 1, -1), vStrTst) + 1;
    return index + index2;
}
}
/*// Contributed Freely to the Public Domain without limitation by Sasun Steinbeck. //*/</lsl>
/*// Contributed Freely to the Public Domain without limitation by Sasun Steinbeck. //*/</lsl>
Third solution, tested
<lsl>
integer uSubStringLastIndex(string hay, string pin)
{
    integer index2 = -1;
    integer index;
    if (pin == "")   
        return 0;
    while (~index)
    {
        index = llSubStringIndex( llGetSubString(hay, ++index2, -1), pin);
        index2 += index;
    }
    return index2;
}
</lsl>
}}
}}



Revision as of 08:59, 22 May 2014

User-Defined Function: integer uSubStringLastIndex( string vStrSrc, string vStrTst );

Returns a integer that is the positive index of the last vStrTst within vStrSrc

  • vStrSrc: source string to check
  • vStrTst: string to look for

if vStrTst is not found in vStrSrc -1 is returned.
the index of the first character is 0


Code:

  • LSO: 182 bytes
  • MONO: 1024 bytes

<lsl>integer uSubStringLastIndex( string vStrSrc, string vStrTst ){

   integer vIdxFnd =
     llStringLength( vStrSrc ) -
     llStringLength( vStrTst ) -
     llStringLength(
       llList2String(
         llParseStringKeepNulls( vStrSrc, (list)vStrTst, [] ),
         0xFFFFFFFF ) //-- (-1)
       );
return (vIdxFnd

Caveats

  • Performs a literal match (case sensitive).
    • Wildcards and RegEx are not supported.
  • Attempting to match an empty string ("") will return 0 instead of -1.

Notes

  • This function is operates exactly like llSubStringIndex (including caveats), from the opposite end of the string.