【问题标题】:How to pattern match in Lua如何在 Lua 中进行模式匹配
【发布时间】:2019-09-23 01:22:40
【问题描述】:

假设我在 Lua 中有这个:

myvara = "Box red"
myvarb = "Box red 36"

如果数字每次都变化,我如何形成一个表达式来查看两个变量是否相同?即我只想检查两个变量是否都是红色框,但数字并不重要。

我想使用模式匹配,但我不知道如何在表达式中有效地做到这一点。我不想用string.find,它必须是模式匹配。

我需要做的是:

if myvara == myvarb (ignoring box number) then... 

... 使用模式匹配(不是 string.find 或类似的东西)。

哦,有时单词的数量可能会有所不同,并且该数字可能位于不同的位置。这就是我需要使用模式匹配的原因。

谢谢。

【问题讨论】:

  • "使用模式匹配(不是 string.find 或类似的东西)。" string.find uses pattern matching.
  • 该页面上有很多不同的方法。我应该使用哪个?它会是 string.gsub 还是 string.match 或其他?我希望能够在一个语句中做到这一点(所以没有 for 循环或任何东西)。
  • 在比较之前将所有数字替换为数字 0:if myvara:gsub("%d+", "0") == myvarb:gsub("%d+", "0") then
  • 我稍微更新了我的问题,因为我认为我的措辞有误。如果我想检查 'red box' 是否等于 'red box x' 其中 x 是任意数字怎么办?

标签: lua


【解决方案1】:

您可以在比较它们之前从两个字符串中删除所有空格和数字:

if (myvara:gsub("[%d ]","") == myvarb:gsub("[%d ]","")) then
  ....

【讨论】:

  • 我想我的措辞都错了。让我再尝试一次。假设我有一个字符串“Red car 3”。如何使用模式匹配将其输出到没有数字 3 的新变量?所以我希望新变量是“红色汽车”。如果它是“红色 3 车”,我又如何使用模式匹配将其输出到新变量?新变量应该又是“红车”。没有gsub可以吗?是不是可以使用 gmatch 之类的,只是让它省略数字?
  • 如果您只删除数字,那么您最终会得到“Red car”(带有尾随空格)和“Red car”(单词之间有两个空格)。那是你要的吗?或者您是否还需要删除数字前面的空格之一?如果数字在字符串的开头怎么办?我认为您需要更好地描述您正在尝试做的事情。
  • 我想我也需要删除空间。所以“红车 3”变成了“红车”,“红车 3”变成了“红车”。
  • 为什么要避开gsub?它对您不可用吗?删除数字比提取其他所有内容要容易得多。另外,Red Car3(没有空格)怎么样?也删除号码?
  • 您必须运行测试以查看哪种方法更好,但这听起来像是过早优化的情况。我会先用gsub 实现它,然后检查它是否会产生任何性能问题。
猜你喜欢
  • 2015-07-19
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多