2016-02-04 30 views
1

我在將字符串拆分爲特殊字符上的兩個字符串時遇到問題。如何在特定字符上拆分字符串

例如:

12345#data 

1234567#data 

我具有在從第二部分,其中是另一個數據(字符,數字與"#"分離的第一部分5-7個字符,不什麼)

我需要分裂和存儲在兩個變量的數據

x = 12345 
y = data 

沒有"#"字符。

我正在尋找一些Lua字符串函數,如splitOn("#")或子字符串直到字符,但我還沒有找到。

+6

@WiktorStribiżew雖然他們看起來很相似,Lua的圖案不是正則表達式,請不要加*正則表達式*標籤了。 –

+2

正則表達式的人也可能知道Lua模式,因此刪除正則表達式標記是沒有意義的。添加lua-patterns標籤是可以的。 –

+5

@WiktorStribiżew這不是標籤應該做的。我會再說一遍:** Lua模式不是正則表達式**。帶有* regex *標籤的問題會讓人們誤解,使用正則表達式的解決方案將成爲這個問題的有效答案,但事實並非如此。 –

回答

7

使用string.match和捕獲。 試試這個:

s = "12345#data" 
a,b = s:match("(.+)#(.+)") 
print(a,b) 
+0

與(否)字符類解決方案相比,'(。+)#(。+)'模式相當低效。因爲'.'與'#'匹配,所以在使用僅僅匹配塊的'[^#] +'而不檢查是否有'#',回溯,檢查等等時,不會發生很多回溯步驟。回溯....直到它檢查你的所有字符串。如果一個正則表達式看起來很「容易」,這並不意味着它是有效的。另外,通過捕獲組,你僅限於一個只有2個塊的字符串,那麼'12#34#56'怎麼樣? –

+0

@WiktorStribiżew,所有有效的點,謝謝。像'^(。+)#(。+)$'中那樣錨定模式可以提高性能,儘管在這個例子中可能並不重要。 – lhf

8

this documentation

所有的

首先,雖然Lua中沒有一個分割功能是其標準庫,它確實有string.gmatch,它可以用來代替分割功能在許多情況下。不同於分割功能,string.gmatch需要一個模式到非分隔符的文本匹配,而不是分隔符,自己

它是一個否定字符類的幫助與string.gmatch容易實現:

local example = "12345#data" 
for i in string.gmatch(example, "[^#]+") do 
    print(i) 
end 

參見IDEONE demo

[^#]+圖案比其他#一個或多個字符(因此,它「分裂」與1個字符的字符串)相匹配。

+0

請注意,否定字符類是由'[^'後跟字符/速記結構/ POSIX字符類並用']'結尾形成的。 –