1

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

编辑:最后一段文本有时会被遗漏(参见示例#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" }
}

提前致谢。

4

2 回答 2

2

使用各种 Lua字符串模式,很容易达到预期的效果。

例如。

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),直到遇到空格。
  • 查找并存储所有字符,直到到达字符串的末尾。

编辑

根据评论中的讨论更改tReturn[iNumber]为。tReturn[tonumber(iNumber)]

于 2013-03-19T21:06:41.597 回答
0

您可以使用string.match具有适当模式的方法:

local n, w, str = ('10 HELLO This is a string'):match'^(%d+)%s+(%S+)%s+(.*)$'
your_table[tonumber(n)] = {w, str}
于 2013-03-19T19:31:01.420 回答