2013-10-25 49 views
2

字符串是否有一个简单的方法来拆这样的字符串:Lua的分裂没有分隔

M34a79 or M2ab943 or M4c4 

M,34,a,79 or M,2,ab,943 or M,4,c,4 

没有任何分隔符?

+2

按照最初提出的问题留下问题并添加解决方案作为答案。 – lhf

回答

4

可以用一对GSUB的做它调用:

x = "M34a79 or M2ab943 or M4c4" 

x, _ = x:gsub("(%d)(%a)", "%1,%2") 
x, _ = x:gsub("(%a)(%d)", "%1,%2") 

print(x) 

男,34,,79或M,2,AB,943或M,4,C,4

可能不适用于所有情况,但对您的示例起作用。

+0

是的,它的工作原理! :)是否有可能将每个这些值存储在变量中? – Lukas

+0

你想让它成为它们的一个表:{“M”,“34”,“a”,“79”},{“M”,“2”,“ab”,“943”},{ “M”,“4”,“c”,“4”}? – Kogitsune

+1

你不需要'_',只需要'x = x:gsub(“(%d)(%a)”,“%1,%2”)就足够了。 –

0

如果你不介意使用LPEG 库:

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

local extract 
do 
    local digit  = R"09" 
    local lower  = R"az" 
    local comma  = P"," 
    local space  = P" " 
    local schema = Ct( C(P"M") 
         * (digit^1/tonumber) 
         * C(lower^1) 
         * (digit^1/tonumber)) 
    local extractor = Ct((schema + 1)^0) 
    extract = function (str) 
    return lpegmatch (extractor, str) 
    end 
end 

这将匹配由输入 字符的所有序列(按顺序)

  • M,
  • 1个或多个十进制数字的序列,
  • 序列1或更多小写字符和
  • 另一个包含一个或多个十进制数字的序列。

在处理输入时,每个匹配都放在一个子表中, 这些数字在运行中转换为Lua数字。 由于该问题提出要求,导致M包含 的条目中。

用例:

local data = extract [[M34a79 or M2ab943 or M4c4]] 

for i = 1, #data do 
    local elm = data[i] 
    print (string.format ("[%d] = { [1] = %q, [2] = %d, [3] = %q, [4] = %d },", 
         i, table.unpack (elm))) 
end 

输出:

[1] = { [1] = "M", [2] = 34, [3] = "a", [4] = 79 }, 
[2] = { [1] = "M", [2] = 2, [3] = "ab", [4] = 943 }, 
[3] = { [1] = "M", [2] = 4, [3] = "c", [4] = 4 },