Lua字符串分割

嗨,我有一个 JavaScript 函数:

    function blur(data) {
    var trimdata = trim(data);
    var dataSplit = trimdata.split(" ");
    var lastWord = dataSplit.pop();
    var toBlur = dataSplit.join(" ");
 }

它的作用是将一个字符串,例如 "Hello my name is bob",转换为 toBlur = "Hello my name is" 和 lastWord = "bob"。

我能否用 Lua 重写这个函数呢?

点赞
用户1633117
用户1633117

你可以使用Lua的模式匹配工具:

function blur(data) do
    return string.match(data, "^(.*)[ ][^ ]*$")
end

这个模式是如何工作的?

^      # 匹配从字符串开头开始 
(      # 开启一个捕获组,被匹配的内容将被返回
  .*   # 匹配任意字符,尽可能多的字符
)      # 捕获组结束
[ ]    # 一个空格(方括号是可省略的,但我认为它们能提高可读性)
[^ ]   # 匹配任意非空格字符,尽可能多的字符
$      # 标记输入字符串的末尾

所以[ ][^ ]*$必须匹配最后一个单词和前面的空格,因此(.*)将返回它前面的所有内容。

为了更直接地将您的JavaScript转换为Lua,请注意Lua中没有split函数。但是,Lua有类似于jointable.concat函数。由于您需要手动分割,所以可能会再次使用模式:

function blur(data) do
    local words = {}
    for m in string.gmatch("[^ ]+") do
        words[#words+1] = m
    end
    words[#words] = nil     -- 弹出最后一个单词
    return table.concat(words, " ")
end

gmatch不会立即给您一个表,而是返回一个遍历所有匹配项的迭代器。因此,您需要将它们添加到自己的临时表中,并在其上调用concatwords[#words+1] = ...是一个Lua习语,用于将元素附加到数组的末尾。

2013-04-13 23:06:51