Lua读取字符串的开头

你好,我正在制作一款冒险游戏,并试图使用户输入一个字符串,如果该字符串以"action"开头,则将在一个函数中读取行的其余部分。

act=io.read();
if act=="blah" then doSomething();
elseif act=="action"+随机字符串 then readRestOfStringAndDoSomethinWwithIt();
else io.write("Unknown action\n");
end
点赞
用户542190
用户542190

请查看此页面 http://lua-users.org/wiki/StringRecipes:

function string.starts(String,Start)
   return string.sub(String,1,string.len(Start))==Start
end

之后使用

elseif string.starts(act, "action") then ...
2014-04-03 08:23:33
用户1155375
用户1155375

可能有许多不同的方法来解决这个问题,以下是其中一种。

userInput = ... -- 然而你从清洗过且安全的字符串中取得输入
firstWord = userInput:match("^(%S+)")
-- 验证 firstWord

你可能想要编写自己的语句解析器,从而将字符串处理成已知的记号等。

2014-04-03 08:23:39
用户869951
用户869951

使用 string.find^ 将模式锚定在字符串开头:

ss1 = "hello"
ss2 = "does not start with hello"
ss3 = "does not even contain hello"

pattern = "^hello"

print(ss1:find(pattern ) ~= nil)  -- true:  正确
print(ss2:find(pattern ) ~= nil)  -- false: 正确
print(ss3:find(pattern ) ~= nil)  -- false: 正确

甚至可以将其作为所有字符串的方法:

string.startswith = function(self, str)
    return self:find('^' .. str) ~= nil
end

print(ss1:startswith('hello'))  -- true: 正确

只要注意,“some string literal”:startswith(str) 是行不通的:字符串字面量没有 string 表函数作为“方法”。你必须使用 tostring 或函数而不是方法:

print(tostring('goodbye hello'):startswith('hello')) -- false: 正确
print(tostring('hello goodbye'):startswith('hello')) -- true: 正确
print(string.startswith('hello goodbye', 'hello'))   -- true: 正确

问题在于最后一行的语法有点令人困惑:是第一个字符串是模式,还是第二个字符串是模式?此外,模式参数(例如例子中的“hello”)可以是任何有效的模式;如果它已经以 ^ 开头,则结果是错误的负面,因此为了健壮性,startswith 方法应该只在没有锚点时添加 ^ 锚点。

2014-04-03 16:32:48