Difference between revisions of "LlSubStringIndex"

From Second Life Wiki
Jump to navigation Jump to search
(whitespace, it's a feature of good code. Changed the snippets to work on an empty needle.)
Line 36: Line 36:
</lsl>
</lsl>


 
'''Basic Example:'''
<lsl>
<lsl>integer index = llSubStringIndex("string data","TEST");
Basic Example:
if(index == -1) {
integer temp=llSubStringIndex("string data","TEST");
    llSay(0),"TEST was not found in the string");
if(temp==-1){llSay(0),"TEST was not found in the string");}
} else {
else{llSay(0,"TEST was found in the string.");}
    llSay(0,"TEST was found in the string.");
 
}</lsl>
 
</lsl>
|helpers=
|helpers=
Tests to see if one string contains a copy of another:
Tests to see if one string contains a copy of another:
Line 57: Line 55:
</lsl>
</lsl>


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


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


Note: Some of the snippets above return a result without ever calling llSubStringIndex.
Note: Some of the snippets above return a result without ever calling llSubStringIndex.
Line 75: Line 69:
2. Clever & smaller (calculates contains in ~54 bytes rather than ~60):
2. Clever & smaller (calculates contains in ~54 bytes rather than ~60):


<lsl>
<lsl>integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
{
     return ~llSubStringIndex(haystack, needle);
     return ~llSubStringIndex(haystack, needle);
}
}</lsl>
</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: 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.

Revision as of 12:51, 6 September 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>

Basic Example: <lsl>integer index = llSubStringIndex("string data","TEST"); if(index == -1) {

   llSay(0),"TEST was not found in the string");

} else {

   llSay(0,"TEST was found in the string.");
}</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 llDeleteSubString(haystack, llStringLength(needle), -1) == needle;

}</lsl>

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

   return llDeleteSubString(haystack, 0, ~llStringLength(needle)) == 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 );