2011-05-17 90 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