如何在指定字符上拆分字符串

Mar*_*rek 1 string lua lua-patterns

我在将字符串拆分为特殊字符的两个字符串时遇到问题.

例如:

12345#data
Run Code Online (Sandbox Code Playgroud)

要么

1234567#data
Run Code Online (Sandbox Code Playgroud)

我在第一部分中有5-7个字符与"#"第二部分分开,其中是另一个数据(字符,数字,无所谓)

我需要将这些数据拆分并存储在两个变量中

x = 12345
y = data 
Run Code Online (Sandbox Code Playgroud)

没有#性格.

我一直在寻找一些Lua字符串函数"#"或字符串,但我还没有找到.

Wik*_*żew 9

请参阅此文档:

首先,尽管Lua没有split函数是它的标准库,但它确实有string.gmatch,在很多情况下可以用它来代替split函数.与split函数不同,string.gmatch采用模式匹配非分隔符文本,而不是分隔符本身

它是用的帮助下很容易实现否定的字符类string.gmatch:

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

请参阅IDEONE演示

[^#]+模式匹配除了之外的一个或多个字符#(因此,它将一个字符串"拆分"为1个字符).


lhf*_*lhf 8

使用string.match和捕获.试试这个:

s = "12345#data"
a,b = s:match("(.+)#(.+)")
print(a,b)
Run Code Online (Sandbox Code Playgroud)

  • 与否定字符类解决方案相比,“(.+)#(.+)”模式效率相当低。由于 `.` 也匹配 `#`,所以当仅使用 `[^#]+` 匹配块而不检查是否有 `#` 时,不会发生很多回溯步骤,回溯,检查,回溯...直到它检查完所有字符串。如果正则表达式看起来“简单”,并不意味着它是有效的。另外,对于捕获组,您只能使用只有 2 个块的字符串,那么“12#34#56”呢? (2认同)