Lua:我如何将一个字符串(不同长度)分成多个部分?

时间:2013-03-19 19:15:50

标签: string lua split

我有一个字符串,从一个数字开始,然后是一个空格,然后是一个未知数量的字母,再一个空格,然后有时另一个文本(可能或可能)不包含多个单词)。

编辑:最后一段文字有时被遗漏(参见示例#2) 使用注释中提到的方法,#2上的str:find(...)将返回nil。

示例:

"(number) (text) [more text]"
1: "10 HELLO This is a string"
2: "88 BYE"

我想要的是将这些字符串拆分成一个表,在包含更多这些拆分字符串的表中,如下所示:

{
  [(number)] = { [1] = (text), [2] = (more text) }
  [10] = { [1] = "HELLO", [2] = "This is a string" }
}

我尝试了几种方法,但没有一种能给我想要的结果。 例如,我尝试过的方法之一是在空格上拆分字符串。但结果是:

{
  [10] = { [1] = "HELLO", [2] = "This", ... [4] = "string" }
}

提前致谢。

2 个答案:

答案 0 :(得分:2)

使用各种Lua string patterns,实现理想的结果非常容易。

例如。

function CustomMatching( sVar )
    local tReturn = {}
    local _, _, iNumber, sWord, sRemain = sVar:find( "^(%d+)%s(%a+)%s(.+)" )
    tReturn[tonumber(iNumber)] = { sWord, sRemain }
    return tReturn
end

并称之为:

local sVar = "10 HELLO This is a string"
local tMyTable = CustomMatching( sVar )

find()方法中,模式"^(%d+)%s(%a+)%s(.+)"表示:

  • 查找并存储所有数字(%d),直至遇到空格。
  • 查找并存储所有字母(%a),直至遇到空格。
  • 查找并存储所有字符,直到到达字符串末尾。

修改

根据comments中的讨论,将tReturn[iNumber]更改为tReturn[tonumber(iNumber)]

答案 1 :(得分:0)

您可以将string.match方法与适当的pattern

一起使用
local n, w, str = ('10 HELLO This is a string'):match'^(%d+)%s+(%S+)%s+(.*)$'
your_table[tonumber(n)] = {w, str}