Lua 中相当于 Python 的endswith() 的是什么?

1 lua nmap

我想将这个Python代码转换为Lua(nmap脚本):

for i in range(1000, 9999):
    if str(i).endswith('9'):
        print(i)
Run Code Online (Sandbox Code Playgroud)

我已经走到这一步了:

for var = 1000, 9000 then
    if tostring(var).endswith('9') then
        print (var)
    end
end
Run Code Online (Sandbox Code Playgroud)

但我不知道 Lua 相当于endswith().

LMD*_*LMD 7

XY-问题

如何最好地将代码移植到 Lua 的 X 问题已经被Quantumpro 回答了,他优化了它并清理了它。

我将重点关注您的 Y 问题:

Python 的 Lua 等价物是什么endswith

调用 OOP 风格的字符串函数

在Lua中,字符串有一个元表,用于索引全局string库表。在 Lua 中调用字符串函数str:func(...),而不是str.func(...)将字符串str作为第一个“self”参数传递(请参阅“Lua 之间和Lua 中的差异”.:)。

此外,如果调用的参数是单个字符串,您可以省略括号,str:func("...")变成str:func"...".

常量后缀:模式匹配

Lua提供了更强大的模式匹配功能,可以用来检查字符串是否以后缀结尾:string.matchstr.endswith("9")在 Python 中相当于str:match"9$"在 Lua 中:$将模式锚定在字符串末尾并9匹配文字字符9

但要小心:这种方法不适用于任意的、可能变量的情况,因为某些字符(例如$)是Lua 模式中的魔术字符,因此具有特殊的含义。考虑str.endswith("."); 这与 Lua 中的不等价string:match".$",因为它.匹配任何字符。

我想说这是检查字符串是否以常量后缀结尾的 lua 式方法。请注意,如果成功,它不会返回 boolean,而是返回一个匹配项(后缀,一个真值);如果不成功,则返回一个nil匹配项(一个假值);因此它可以安全地在 s 中使用if。要将结果转换为布尔值,您可以使用not not string:match"9$".

可变后缀:滚动你自己的

Lua的标准库非常简约;因此,即使是基本的事情,您也经常需要推出自己的函数。有两种可能的实现endswith,一种使用模式匹配,另一种使用子字符串;后一种方法更可取,因为它更短,可能更快(Lua 使用简单的模式匹配引擎)并且不必处理模式转义:

function string:endswith(suffix)
    return self:sub(-#suffix) == suffix
end
Run Code Online (Sandbox Code Playgroud)

说明:返回第一个参数self:sub(-#suffix)的最后一个后缀长度字符。self这是与后缀进行比较的。

然后您可以使用冒号 ( :) 语法调用此函数:

str = "prefixsuffix"
assert(str:endswith"suffix")
assert(not str:endswith"prefix")
Run Code Online (Sandbox Code Playgroud)