2016-02-04 33 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字符类并用']'结尾形成的。 –