2016-07-24 57 views
2

在某些网络服务,我收到此如何隔离Lua中星号分隔的数字?

“时间”:“0.301 * 0.869 * 1.387 * 2.93 * 3.653 * 3.956 * 4.344 * 6.268 * 6.805 * 7.712 * 9.099 * 9.784 * 11.071 * 11.921 * 13.347 * 14.253 * 14.965 * 16.313 * 16.563 * 17.426 * 17.62 * 18.114“

我想分开数字并将它们插入到这样的表中,怎么样?

0.301 
0.869 
1.387 
2.93 
3.653 
3.956 
4.344 
6.268 
6.805 
7.712 
9.099 
9.784 
11.071 
11.921 
13.347 
14.253 
14.965 
16.313 
16.563 
17.426 
17.62 
18.114 

回答

6

小串匹配应该把工作做好:

local str = [["time":"0.301*0.869*1.387*2.93*3.653*3.956*4.344*6.268*6.805*7.712*9.099*9.784*11.071*11.921*13.347*14.253*14.965*16.313*16.563*17.426*17.62*18.114"]] 

local list = {} 

for num in str:gmatch("%**(%d+%.%d+)") do 
table.insert(list, tonumber(num)) 
end 

一点解释

我先简要总结一下一些符号这里:

%d这意味着寻找一个特定的数字。

%.指具体来看一段

+手段来寻找1个或更多的你想更早匹配特定的事情。

%*表示专门寻找明星。

*当百分比符号不在前面时,这意味着您可以匹配0个或多个特定的匹配项。


现在,让我们把这个一起来了解一下它从一开始:

%**这意味着,我们希望字符串开始一个明星,但它是可选的。我们需要它是可选的原因是因为你想要的第一个数字在它前面没有星号。

%d+意味着要查找一个数字序列,直到其他东西弹出。在我们的例子中,这就像'18 .114'中的'18'或者'1.387'中的'1',

, , ,

%.,正如我所说的,意味着我们希望接下来发现的一段时间。

%d+表示我们需要另一个数字序列。如11418.114

那么,括号是什么意思呢?这只意味着当我们捕获模式时,我们不关心括号外的任何其他内容。

+0

不错,但你能解释一下gmatch里面的东西吗? 任何解释,如果我想在未来做我自己的不同比赛? – DeyaEldeen

+0

请参阅有关此主题的lua手册:https://www.lua.org/manual/5.3/manual.html#6.4.1。 %**匹配任何数量的*(%*是一个文字*),但事实上在这种情况下不需要。你可以简单地匹配数字。这些数字由一串数字(%d)组成,其中必须至少有一个(+),然后是一个字面点(%。),然后是一串数字。洞匹配被捕获,因此()被添加在数字周围。 – pschulz

+1

您正在将字符串插入表中,而不是数字。 –