Difference between revisions of "LlSubStringIndex"

From Second Life Wiki
Jump to navigation Jump to search
(Undo revision 76917 by Chaz Longstaff (Talk) You cannot post code from other wikis without permission from the content authors.)
Line 5: Line 5:
|func_footnote=If '''pattern''' is not found in '''source''', {{HoverText|-1|negative one, 0x{{LSL_Hex/Write|-1}}}} is returned.<br/>
|func_footnote=If '''pattern''' is not found in '''source''', {{HoverText|-1|negative one, 0x{{LSL_Hex/Write|-1}}}} is returned.<br/>
The index of the first character in the string is {{HoverText|0|zero}}
The index of the first character in the string is {{HoverText|0|zero}}
You cannot search backwards using a negative number, unless you use the user-created function supplied below.
|func_desc
|func_desc
|return_text=that is the index of '''pattern''' in '''source'''.
|return_text=that is the index of '''pattern''' in '''source'''.
Line 13: Line 11:
**Wildcards and RegEx are not supported.
**Wildcards and RegEx are not supported.
*Attempting to match an empty string ("") will return 0 instead of -1.
*Attempting to match an empty string ("") will return 0 instead of -1.
*There is no function to search the string from the end or search starting at a specific offset.
|constants
|constants
|examples=
|examples=Matching against last names:
 
Note: some people maintain that this function is relatively slow compared to other LSL functions. They are not certain if it is because of execution time, or some built-in delay.
 
Matching against last names:
<lsl>
<lsl>
default
default
Line 80: Line 75:


Note: Smaller was not noticeably faster or slower when our [[Code Racer]] and [[Efficiency Tester]] harnesses measured the expression <nowiki>{ contains("wiki.secondlife.com", "wiki"); }</nowiki>.
Note: Smaller was not noticeably faster or slower when our [[Code Racer]] and [[Efficiency Tester]] harnesses measured the expression <nowiki>{ contains("wiki.secondlife.com", "wiki"); }</nowiki>.
3. '''Function to search backwards'''
<lsl>
integer llSubStringIndexRev(string src, string pattern, integer start) {
  string StrPart;
    integer Pos = start + 1;
   
    do{
        Pos = Pos - 1;
        StrPart = llGetSubString(src, Pos, Pos + llStringLength(pattern) - 1);
    }
    while (Pos > -1 && StrPart != pattern);
      return Pos;
}
</lsl>
(Source: retrieved from http://rpgstats.com/wiki/index.php?title=LlSubStringIndex July 2008, with slight modifications to reduce text.
|also_functions=
|also_functions=
{{LSL DefineRow||[[llListFindList]]|Find a list in another list}}
{{LSL DefineRow||[[llListFindList]]|Find a list in another list}}

Revision as of 04:36, 8 July 2008

Summary

Function: integer llSubStringIndex( string source, string pattern );

Returns an integer that is the index of pattern in source.

• string source
• string pattern

If pattern is not found in source, -1 is returned.
The index of the first character in the string is 0

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.
  • There is no function to search the string from the end or search starting at a specific offset.
All Issues ~ Search JIRA for related Bugs

Examples

Matching against last names: <lsl> default {

   state_entry()
   {
       llSensorRepeat("", NULL_KEY, AGENT, PI, 96.0, 20);
   }
   
   sensor(integer NumDet)
   {
       integer i;
       
       //Loop through all the sensor data and match against " Linden", 
       //this causes it to match with any last name of Linden (since there can't be spaces before the firstname)
       //Alternatively you could match a firstname with "FirstName "
       for(i = 0; i < NumDet; ++i)
           if(~llSubStringIndex(llDetectedName(i), " Linden"))
               llInstantMessage(llDetectedKey(i), "Hello, I see you!");
   }

}

</lsl>

Useful Snippets

Tests to see if one string contains a copy of another:

1. Concise & conventional:

<lsl> integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return 0 <= llSubStringIndex(haystack, needle);

} </lsl>

<lsl> integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return llGetSubString(haystack, 0, llStringLength(needle) - 1) == needle; } </lsl>

<lsl> integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return llGetSubString(haystack, -llStringLength(needle), -1) == needle; } </lsl>

Note: Some of the snippets above return a result without ever calling llSubStringIndex.

2. Clever & smaller (calculates contains in ~54 bytes rather than ~60):

<lsl> integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return ~llSubStringIndex(haystack, needle);

} </lsl>

Note: The llSubStringIndex function returns -1 only when not found and the ~ operator returns zero only for -1, so the clever combination ~llSubStringIndex returns zero only for not found, else nonzero for found.

Note: Smaller was not noticeably faster or slower when our Code Racer and Efficiency Tester harnesses measured the expression { contains("wiki.secondlife.com", "wiki"); }.

See Also

Functions

•  llListFindList Find a list in another list
•  llGetSubString Copy out part of a string of characters

Deep Notes

Search JIRA for related Issues

Signature

function integer llSubStringIndex( string source, string pattern );