Difference between revisions of "String (API)"

From ComputerCraft Wiki
Jump to: navigation, search
(string.gmatch(string, pattern))
(Undo revision 4703 by 46.231.129.69 (talk))
 
(12 intermediate revisions by 11 users not shown)
Line 13: Line 13:
 
"abc=def":gmatch("%a.*")  -- Works
 
"abc=def":gmatch("%a.*")  -- Works
 
"abc=def":gmatch("[%a.]*")  -- Hang
 
"abc=def":gmatch("[%a.]*")  -- Hang
"abc=def":gmatch("[^=]*")  -- Hang - Alternative: "([^=]*)=?"
+
"abc=def":gmatch("[^=]*")  -- Hang
 +
"abc=def":gmatch("([^=]*)=?") -- Works (Note: This produces the same result as the above pattern should)
 
"abcdef":gmatch("[^=]*")  -- Works
 
"abcdef":gmatch("[^=]*")  -- Works
 
"abc=def":gmatch("[^=]*=")  -- Works
 
"abc=def":gmatch("[^=]*=")  -- Works
 
</pre>
 
</pre>
 +
 +
===string.sub / string.find ===
 +
 +
Both string.sub and string.find work on their own, but calling string.find on a string returned by string.sub will return the index of the character in the original string, not the sub string you are referencing.
 +
 +
Example:
 +
<pre>
 +
local testString = "This is a sample string";
 +
local testSubString = string.sub(testString,5);
 +
 +
local indexOfSample = string.find(testSubString,"sample");
 +
</pre>
 +
 +
indexOfSample is returned 11 instead of the expected 7
 +
 +
Concatenating a blank string onto the end of the string causes new memory to be allocated and works properly again
 +
 +
<pre>
 +
local testString = "This is a sample string";
 +
local testSubString = string.sub(testString,5);
 +
 +
local indexOfSample = string.find(testSubString.."","sample");
 +
</pre>
 +
 +
This is also a problem with using string.find on command line arguments, as this returns the index in the full command path instead of the specific argument.
 +
  
 
[[Category:APIs]]
 
[[Category:APIs]]

Latest revision as of 03:24, 7 December 2012

The string API is a default Lua 5.1 API as defined here. Please list any non-working functions below.

Non-Working Functions

string.gmatch(string, pattern)

Using any quantifier other than + will cause it to hang if that quantifier applies to the whole pattern and that pattern does not match the whole string.

Examples:

"abcdef":gmatch("%a*")   -- Works
"abc=def":gmatch("%a*")   -- Hang
"abc=def":gmatch("%a.*")  -- Works
"abc=def":gmatch("[%a.]*")  -- Hang
"abc=def":gmatch("[^=]*")  -- Hang
"abc=def":gmatch("([^=]*)=?") -- Works (Note: This produces the same result as the above pattern should)
"abcdef":gmatch("[^=]*")  -- Works
"abc=def":gmatch("[^=]*=")  -- Works

string.sub / string.find

Both string.sub and string.find work on their own, but calling string.find on a string returned by string.sub will return the index of the character in the original string, not the sub string you are referencing.

Example:

local testString = "This is a sample string";
local testSubString = string.sub(testString,5);

local indexOfSample = string.find(testSubString,"sample");

indexOfSample is returned 11 instead of the expected 7

Concatenating a blank string onto the end of the string causes new memory to be allocated and works properly again

local testString = "This is a sample string";
local testSubString = string.sub(testString,5);

local indexOfSample = string.find(testSubString.."","sample");

This is also a problem with using string.find on command line arguments, as this returns the index in the full command path instead of the specific argument.