lua - 如何使用模式匹配找到重复的字符串?

标签 lua lua-patterns world-of-warcraft

我有一个类似于这样的字符串:

[13:41:25] [100:Devnull]: 01:41:20, 13:41:21> |Hunit:Player-3693-07420299:DevnullYour [Chimaera Shot] hit |Hunit:Creature-0-3693-1116-3-87318-0000881AC4:Dungeoneer's Training DummyDungeoneer's Training Dummy 33265 Nature. 

如果你想知道,它来自魔兽世界。

我想以这样的方式结束:
[13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training Dummy 33265 Nature. 

如果您注意到,“Dungeoneer's Training Dummy”会打印两次。我已经设法摆脱了第一个“|Hunit”部分,如下所示:
str = "[13:41:25] [100:Devnull]: 01:41:20, 13:41:21> |Hunit:Player-3693-07420299:DevnullYour [Chimaera Shot] hit |Hunit:Creature-0-3693-1116-3-87318-0000881AC4:Dungeoneer's Training DummyDungeoneer's Training Dummy 33265 Nature."
str = string.gsub(str, "|Hunit:.*:.*Your", "Your")

返回这个:
print(str)    # => [13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit |Hunit:Creature-0-3693-1116-3-87318-0000881AC4:Dungeoneer's Training DummyDungeoneer's Training Dummy 33265 Nature.

然后我添加第二个 gsub:
str = string.gsub(str, "|Hunit:.*:", "")
print(str) # => [13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training DummyDungeoneer's Training Dummy 33265 Nature.

但是很明显,重复的“Dungeoneer's Training Dummy”字符串是重复的。

我怎样才能摆脱重复的字符串?这个字符串可以是其他任何东西,在这种情况下是“Dungeoneer's Training Dummy”,但它可以是任何其他目标的名称。

最佳答案

你可以尝试这样的事情:

str = "[13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training DummyDungeoneer's Training Dummy 33265 Nature."
-- find a string that starts with 'hit', has some number of non-digits
-- and ends with one or more digit and one or more characters.
-- these characters will be "captured" into three strings,
-- which are then passed to the "replacement" function.
-- the returned result of the function replaces the value in the string.
str = str:gsub("(hit%s+)([^%d]+)(%d+.+)", function(s1, s2, s3)
    local s = s2:gsub("%s+$","") -- drop trailing spaces
    if #s % 2 == 0 -- has an even number of characters
    and s:sub(0, #s / 2) -- first half
    == -- is the same
    s:sub(#s / 2 + 1) -- as the second half
    then -- return the second half
      return s1..s:sub(#s / 2 + 1)..' '..s3
    else
      return s1..s2..s3
    end
  end)
print(str)

这打印:[13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training Dummy
此代码将尝试提取目标的名称并检查名称是否完全重复。如果匹配失败,则返回原始字符串。

关于lua - 如何使用模式匹配找到重复的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29154741/

相关文章:

lua - 使用 Lua 进行 Web 开发?

string - Lua string.gsub具有多个模式

text - Lua 匹配错误的模式

javascript - HTML 数据抓取(我认为)

lua - 使用 "array style"表是否比使用 "map style"表提供更快的读取访问?

c++ - 循环遍历 Lua 表格中的表格

Lua:替换一个子串

world-of-warcraft - 如何修改艾泽拉斯核心中角色的可用天赋总数?

lua - 尝试索引字段 'text'(零值)

c++ - c标准库的LuaBind绑定(bind)?