LlSubStringIndex
From Second Life Wiki
| LSL Portal | | | Functions | | | Events | | | Types | | | Operators | | | Constants | | | Flow Control | | | Script Library | | | Tutorials |
Description
Function: integer llSubStringIndex( string source, string pattern );| 181 | Function ID |
| 0.0 | Delay |
| 10.0 | Energy |
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.
Examples
Matching against last names:
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!"); } }
Useful Snippets
Tests to see if one string contains a copy of another:
1. Concise & conventional:
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return 0 <= llSubStringIndex(haystack, needle); }
integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return llGetSubString(haystack, 0, llStringLength(needle) - 1) == needle; }
integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return llGetSubString(haystack, -llStringLength(needle), -1) == needle; }
Note: Some of the snippets above return a result without ever calling llSubStringIndex.
2. Clever & smaller (calculates contains in ~54 bytes rather than ~60):
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return ~llSubStringIndex(haystack, needle); }
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 |

