当前位置:  开发笔记 > 编程语言 > 正文

在Lua中拆分字符串?

如何解决《在Lua中拆分字符串?》经验,为你挑选了8个好方法。

我需要对字符串进行简单的拆分,但似乎没有这个功能,我测试的手动方式似乎不起作用.我该怎么办?



1> 小智..:

这是我非常简单的解决方案.使用gmatch函数捕获包含除所需分隔符以外的ANYTHING的至少一个字符的字符串.默认情况下,分隔符是ANY空格(Lua中为%s):

function mysplit (inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={}
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                table.insert(t, str)
        end
        return t
end


哇,这整个问题的第一个答案实际上有一个返回表的函数.请注意,t和i需要"局部"修饰符,因为它是覆盖全局变量.:)
正如其他人所指出的,您可以通过使用table.insert(t,str)而不是t [i] = str来简化这一过程,然后您不需要i = 1或i = i +1
那就对了。在这种情况下,下一个版本将可用:`function split(inputstr,sep)sep = sep或'%s'本地t = {},用于string.gmatch(inputstr,“([[^” .. sep。 。“] *)(” .. sep ..“?)”))如果s ==“”,则执行table.insert(t,field),然后返回t end end end`
如果字符串包含空值,则不起作用,例如.''富,, bar'`.你得到`{'foo','bar'}`而不是`{'foo','','bar'}`

2> gwell..:

如果要在Lua中拆分字符串,则应尝试使用string.gmatch()或string.sub()方法.如果您知道要将字符串拆分为的索引,请使用string.sub()方法;如果要解析字符串以找到要拆分字符串的位置,请使用string.gmatch().

使用Lua 5.1参考手册中的 string.gmatch()的示例:

 t = {}
 s = "from=world, to=Lua"
 for k, v in string.gmatch(s, "(%w+)=(%w+)") do
   t[k] = v
 end



3> Hugo..:

如果你只想迭代令牌,这非常简洁:

line = "one, two and 3!"

for token in string.gmatch(line, "[^%s]+") do
   print(token)
end

输出:

一,

3!

简短说明:"[^%s] +"模式匹配空格字符之间的每个非空字符串.


模式“%S”等于您提到的模式,因为“%S”是对“%s”的否定,就像“%D”是对“%d”的否定一样。另外,“%w”等于“ [A-Za-z0-9 _]”(根据您的语言环境,可能支持其他字符)。

4> Norman Ramse..:

就像在字符串中string.gmatch找到模式一样,这个函数会找到模式之间的东西:

function string:split(pat)
  pat = pat or '%s+'
  local st, g = 1, self:gmatch("()("..pat..")")
  local function getter(segs, seps, sep, cap1, ...)
    st = sep and seps + #sep
    return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
  end
  return function() if st then return getter(st, g()) end end
end

默认情况下,它返回由空格分隔的任何内容.


+1.注意任何其他Lua初学者:这会返回一个迭代器,'patterns patterns'包括字符串的开头和结尾.(作为一个新手,我不得不尝试解决这些问题.)

5> 小智..:

这是功能:

function split(pString, pPattern)
   local Table = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pPattern
   local last_end = 1
   local s, e, cap = pString:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
     table.insert(Table,cap)
      end
      last_end = e+1
      s, e, cap = pString:find(fpat, last_end)
   end
   if last_end <= #pString then
      cap = pString:sub(last_end)
      table.insert(Table, cap)
   end
   return Table
end

称之为:

list=split(string_to_split,pattern_to_match)

例如:

list=split("1:2:3:4","\:")


欲了解更多信息,请访问:http:
//lua-users.org/wiki/SplitJoin



6> Ivo Beckers..:

我喜欢这个简短的解决方案

function split(s, delimiter)
    result = {};
    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end


使用点作为分隔符(或可能是任何其他模式魔术字符)时失败

7> Diego Pino..:

因为有一种方法来给猫皮肤,这是我的方法:

代码:

#!/usr/bin/env lua

local content = [=[
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
ullamco laboris nisi ut aliquip ex ea commodo consequat.
]=]

local function split(str, sep)
   local result = {}
   local regex = ("([^%s]+)"):format(sep)
   for each in str:gmatch(regex) do
      table.insert(result, each)
   end
   return result
end

local lines = split(content, "\n")
for _,line in ipairs(lines) do
   print(line)
end

输出: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

说明:

gmatch函数用作迭代器,它获取匹配的所有字符串regex.该regex直到它找到一个分离器需要的所有字符.



8> 小智..:

您可以使用以下方法:

function string:split(delimiter)
  local result = { }
  local from  = 1
  local delim_from, delim_to = string.find( self, delimiter, from  )
  while delim_from do
    table.insert( result, string.sub( self, from , delim_from-1 ) )
    from  = delim_to + 1
    delim_from, delim_to = string.find( self, delimiter, from  )
  end
  table.insert( result, string.sub( self, from  ) )
  return result
end

delimiter = string.split(stringtodelimite,pattern) 

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有