我在將字符串拆分爲特殊字符上的兩個字符串時遇到問題。如何在特定字符上拆分字符串
例如:
12345#data
或
1234567#data
我具有在從第二部分,其中是另一個數據(字符,數字與"#"
分離的第一部分5-7個字符,不什麼)
我需要分裂和存儲在兩個變量的數據
x = 12345
y = data
沒有"#"
字符。
我正在尋找一些Lua字符串函數,如splitOn("#")
或子字符串直到字符,但我還沒有找到。
我在將字符串拆分爲特殊字符上的兩個字符串時遇到問題。如何在特定字符上拆分字符串
例如:
12345#data
或
1234567#data
我具有在從第二部分,其中是另一個數據(字符,數字與"#"
分離的第一部分5-7個字符,不什麼)
我需要分裂和存儲在兩個變量的數據
x = 12345
y = data
沒有"#"
字符。
我正在尋找一些Lua字符串函數,如splitOn("#")
或子字符串直到字符,但我還沒有找到。
使用string.match
和捕獲。 試試這個:
s = "12345#data"
a,b = s:match("(.+)#(.+)")
print(a,b)
與(否)字符類解決方案相比,'(。+)#(。+)'模式相當低效。因爲'.'與'#'匹配,所以在使用僅僅匹配塊的'[^#] +'而不檢查是否有'#',回溯,檢查等等時,不會發生很多回溯步驟。回溯....直到它檢查你的所有字符串。如果一個正則表達式看起來很「容易」,這並不意味着它是有效的。另外,通過捕獲組,你僅限於一個只有2個塊的字符串,那麼'12#34#56'怎麼樣? –
@WiktorStribiżew,所有有效的點,謝謝。像'^(。+)#(。+)$'中那樣錨定模式可以提高性能,儘管在這個例子中可能並不重要。 – lhf
首先,雖然Lua中沒有一個分割功能是其標準庫,它確實有
string.gmatch
,它可以用來代替分割功能在許多情況下。不同於分割功能,string.gmatch
需要一個模式到非分隔符的文本匹配,而不是分隔符,自己
它是一個否定字符類的幫助與string.gmatch
容易實現:
local example = "12345#data"
for i in string.gmatch(example, "[^#]+") do
print(i)
end
的[^#]+
圖案比其他#
一個或多個字符(因此,它「分裂」與1個字符的字符串)相匹配。
請注意,否定字符類是由'[^'後跟字符/速記結構/ POSIX字符類並用']'結尾形成的。 –
@WiktorStribiżew雖然他們看起來很相似,Lua的圖案不是正則表達式,請不要加*正則表達式*標籤了。 –
正則表達式的人也可能知道Lua模式,因此刪除正則表達式標記是沒有意義的。添加lua-patterns標籤是可以的。 –
@WiktorStribiżew這不是標籤應該做的。我會再說一遍:** Lua模式不是正則表達式**。帶有* regex *標籤的問題會讓人們誤解,使用正則表達式的解決方案將成爲這個問題的有效答案,但事實並非如此。 –