37

我已经用谷歌搜索了,但我没有得到它。看似如此简单的功能,但Lua当然没有。

在Python中我会做

string = "cat,dog"
one, two = string.split(",")

然后我会有两个变量,一个= cat。二 = 狗

我如何在 Lua 中做到这一点!?

4

7 回答 7

68

尝试这个

str = 'cat,dog'
for word in string.gmatch(str, '([^,]+)') do
    print(word)
end

'[^,]' 表示“除逗号之外的所有内容,+ 符号表示“一个或多个字符”。括号创建捕获(在这种情况下并不真正需要)。

于 2013-10-09T03:57:25.373 回答
34

如果你可以使用库,答案是(在 Lua 中经常)使用 Penlight

如果 Penlight 对您来说太重,而您只想像示例中那样用单个逗号分割字符串,则可以执行以下操作:

string = "cat,dog"
one, two = string:match("([^,]+),([^,]+)")
于 2013-10-09T10:15:03.167 回答
16

在页面顶部添加此拆分功能:

function string:split( inSplitPattern, outResults )
  if not outResults then
    outResults = { }
  end
  local theStart = 1
  local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  while theSplitStart do
    table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) )
    theStart = theSplitEnd + 1
    theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  end
  table.insert( outResults, string.sub( self, theStart ) )
  return outResults
end

然后执行以下操作:

local myString = "Flintstone, Fred, 101 Rockledge, Bedrock, 98775, 555-555-1212"

local myTable = myString:split(", ")
for i = 1, #myTable do
   print( myTable[i] ) -- This will give your needed output
end

更多信息,请访问:教程:Lua String Magic

继续编码......:)

于 2013-10-09T04:42:24.247 回答
5

-- 像 C strtok 一样,在一个分隔符上拆分(查找每个不包含任何分隔符的字符串)

function split(source, delimiters)
        local elements = {}
        local pattern = '([^'..delimiters..']+)'
        string.gsub(source, pattern, function(value) elements[#elements + 1] =     value;  end);
        return elements
  end

-- 示例: var elements = split("bye# bye, miss$ american@ pie", ",#$@ ") -- 返回 "bye" "bye" "miss" "american" "pie"

于 2015-04-07T17:03:20.510 回答
3

To also handle optional white space you can do:

str = "cat,dog,mouse, horse"
for word in str:gmatch('[^,%s]+') do
    print(word)
end

Output will be:

cat
dog
mouse
horse
于 2018-07-25T20:07:36.997 回答
2

这就是我在 mediawiki 上的做法:

str = "cat,dog"
local result = mw.text.split(str,"%s*,%s*")
-- result[0] will give "cat", result[1] will give "dog"

实际上,如果你不关心空间,你可以使用:

str = "cat,dog"
local result = mw.text.split(str,",")
-- result[0] will give "cat", result[1] will give "dog"

这里使用的 API 在Scribunto MediaWiki 扩展中实现。这是split()方法参考文档,这里是源代码。它依赖于 Scribunto 的 Lua 通用库中的许多其他功能,因此只有在您实际使用 MediaWiki 或计划导入大部分 Scribunto 通用库时,它才对您有效。

于 2014-04-30T20:02:00.987 回答
1

Lua 中基本上不需要类似的函数,因为您可以在LPEGstring.split()中表达字符串操作。如果您仍然需要专用功能,一种方便的方法是定义一个拆分器工厂(在下面的代码段中),然后您可以从中派生自定义拆分器。mk_splitter()

local lpeg      = require "lpeg"
local lpegmatch = lpeg.match
local P, C      = lpeg.P, lpeg.C

local mk_splitter = function (pat)
  if not pat then
    return
  end
  pat            = P (pat)
  local nopat    = 1 - pat
  local splitter = (pat + C (nopat^1))^0
  return function (str)
    return lpegmatch (splitter, str)
  end
end

使用 LPEG 的优点是该函数接受有效的 Lua 字符串和模式作为参数。

以下是如何使用它来创建一个在,字符处拆分字符串的函数:

commasplitter = mk_splitter ","

print (commasplitter [[foo, bar, baz, xyzzy,]])
print (commasplitter [[a,b,c,d,e,f,g,h]])
于 2013-10-09T10:21:53.337 回答