【问题标题】:How to match a part of string before a character into one variable and all after it into another如何将字符之前的部分字符串匹配到一个变量中,然后将其全部匹配到另一个变量中
【发布时间】:2019-05-09 21:40:52
【问题描述】:

在特殊字符上将字符串分成两部分时遇到问题。

例如:

12345#data

1234567#data

我在第一部分有 5-7 个字符,用 "#" 与第二部分隔开,另一个数据在哪里(字符、数字,无所谓)

我需要在# 的每一侧将两个部分存储在两个变量中:

x = 12345
y = data 

没有"#" 字符。

我一直在寻找一些 Lua 字符串函数,例如 splitOn("#") 或 substring until character,但我没有找到。

【问题讨论】:

  • @Wiktor Stribiżew 虽然它们看起来很相似,但 Lua 模式不是正则表达式,请不要添加 regex 标签。
  • 正则表达式的人,也可能知道 Lua 模式,因此删除正则表达式标签是没有意义的。添加lua-patterns标签就可以了。
  • @WiktorStribiżew 这不是标签应该做的。我再说一遍:Lua 模式不是正则表达式。带有 regex 标签的问题会让人们感到困惑,使用 regex 的解决方案将是该问题的有效答案,但事实并非如此。
  • @WiktorStribiżew 不,我不是这么说的,你显然对 Lua 模式没有完全了解,请阅读PiL。 Lua 模式匹配不是正则表达式的扩展,就像其他语言/工具中的正则表达式一样。举个简单的例子,在 Lua 中尝试print(string.match("ababab","(ab)+")),它并没有像你预期的那样工作,例如,the result in Ruby
  • 关于这个问题的回滚战正在 meta 上讨论here

标签: string lua lua-patterns


【解决方案1】:

使用string.match 并捕获。 试试这个:

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

【讨论】:

  • (.+)#(.+) 模式与否定字符类解决方案相比效率相当低。因为. 也匹配#,所以当使用仅匹配块而不检查我们是否有#[^#]+ 时,有很多回溯步骤不会发生,回溯,检查,回溯...... . 直到它检查你所有的字符串。如果一个正则表达式看起来“简单”并不意味着它是有效的。此外,对于捕获组,您只能使用 2 个块的字符串,那么 12#34#56 呢?
  • @WiktorStribiżew,所有有效积分,谢谢。锚定^(.+)#(.+)$ 中的模式对性能有很大帮助,尽管在此示例中可能无关紧要。
【解决方案2】:

this documentation:

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

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

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

IDEONE demo

[^#]+ 模式匹配除# 之外的一个或多个字符(因此,它用 1 个字符“拆分”一个字符串)。

【讨论】:

  • 请注意,否定字符类由[^ 后跟字符/速记结构/POSIX 字符类组成,并以] 结束。
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 2020-03-12
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2023-01-21
相关资源
最近更新 更多