Separate Words
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Function: list SeparateWords(string src,string separators,string spacers);
Returns a list that is src broken into a list, discarding separators, keeping spacers, discards any null values generated. Same as LSL funtion llParseString2List, but not limited to 8 spacers or separators.
Thus you may substitute a call to the llParseString2List function by a call to SeparateWords whenever you have more than 8 separators or more than 8 spacers.
• string | src | – | source string | |
• list | separators | – | separators to be discarded | |
• list | spacers | – | spacers to be kept |
separators and spacers must be lists of strings.
To avoid contradiction, every string of the spacers list of strings to keep must not exist in the separators list of strings to discard.
See Also
See also the parseString2List function among the useful snippets of the llParseString2List article.
Specification
list applyLlParseString2List(list sources, list separators, list spacers) { list words = []; integer lenSources = llGetListLength(sources); integer i = 0; for (; i < lenSources; ++i) { string source = llList2String(sources, i); words += llParseString2List(source, separators, spacers); } return words; } // Divide a source string into words // See the chars between separators or spacers, and each spacer, as a word // Never see the empty string as a word list SeparateWords(string src, list separators, list spacers) { // Begin with all chars in one word list words = (list)src; // List the chars between spacers, and each spacer, as a word integer lenSpacers = llGetListLength(spacers); integer i = 0; for (; i < lenSpacers; i += 8) { list some = llList2List(spacers, i, i + 7); words = applyLlParseString2List(words, [], some); } // Discard the separators after letting the separators separate words integer lenSeparators = llGetListLength(separators); for (i = 0; i < lenSeparators; i += 8) { list some = llList2List(separators, i, i + 7); words = applyLlParseString2List(words, some, []); } // Succeed return words; }
Example
Example to separate this src:
42 0.99 \"00000000-0000-0000-0000-000000000000\" [abc, def] \"xyz\\\\\"zyx\" <0, 1, 2, 3> // source literals
Says:
0: 42
1: 0.99
2: "
3: 00000000
4: -
5: 0000
6: -
7: 0000
8: -
9: 0000
10: -
11: 000000000000
12: "
13: [
14: abc
15: def
16: ]
17: "
18: xyz
19: \
20: \
21: "
22: zyx
23: "
24: <
25: 0
26: 1
27: 2
28: 3
29: >
30: /
31: /
32: source
33: literals
OK
string lf = "\n"; string quote = "\""; string escape = "\\"; list spacers = [quote, "(", ")", "<", ">", "[", "]", "/", "+", "-", "*", "%", escape]; list separators() { string tab = llUnescapeURL("%09"); // != "\t" string cr = llUnescapeURL("%0D"); // != "\r" return [tab, lf, cr, " ", ",", ";"]; } default { state_entry() { string chars = "42 0.99 \"00000000-0000-0000-0000-000000000000\" [abc, def] \"xyz\\\\\"zyx\" <0, 1, 2, 3> // source literals"; list words = SeparateWords(chars, separators(), spacers); integer lenWords = llGetListLength(words); integer i = 0; for (; i < lenWords; ++i) { llOwnerSay((string) i + ": " + llList2String(words, i)); } llOwnerSay("OK"); } }