2011-05-17 52 views
5

我有一个字符串,如first part;second part。我想将它拆分为;并返回第二部分。一切工作正常:在分隔符上分割一个字符串

start = mystring:find(';') 
result = mystring:sub(start) 

,但我希望做一个行:

result = mystring:sub(mystring:find(';')) 

它不会抛出一个错误,但它没有返回预期的结果。不是一个大问题,因为它可以在两行代码中正常工作,但是理解为什么它不在oneliner上工作,这将有助于我更好地理解lua如何工作。

回答

1

这也将工作:

result = mystring:sub((mystring:find(';'))) 

额外的括号确保sub被称为只有一个参数,因此它将使用第二个参数的默认值(mystring的结尾)。

3

find实际上会返回两个值,它们是您查找字符串的起始和结束索引。在这种情况下,两个索引都是11.
然后,当您将这两个索引传递给sub时,会得到一个子字符串,它们的起始和结束都是11,因此您只能得到';'。

+0

还有什么神奇的功能,只需将第一个索引传递给sub()函数,而无需先将其分配给变量?像'mystring:sub(mystring:find(';')[1])'(这当然不起作用) – ripat 2011-05-17 16:54:13

+0

@ripat lhf已经回答了这个问题。另请看这个页面:[http://lua-users.org/wiki/SplitJoin](http://lua-users.org/wiki/SplitJoin)。例如,如果您的字符串有两个以上的部分,您可能会获得更好的解决方案。 – Zecc 2011-05-18 09:11:22

3

试试这个:

s="first part;second part" 
print(s:match(";(.-)$")) 

或本:

print(s:sub(s:find(";")+1,-1)) 
+0

确实不太详细。但我倾向于避免使用通常比字符串函数慢的正则表达式。至于match()函数是不是'(;-)$''模式就足够了? – ripat 2011-05-17 17:48:19

+0

只是做了一些时间,找到+ sub比这次的比赛快6倍左右。所以我会坚持find + sub thingie。 – ripat 2011-05-17 18:06:21

+0

@ripat的确如此。我编辑了我的答案。 – lhf 2011-05-17 18:10:23