How to find a duplicate string with Pattern Matching?

I have a string similar to this:

[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. 

In case you wonder, it's from World of Warcraft.

I'd like to end with something like this:

[13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training Dummy 33265 Nature. 

If you notice, "Dungeoneer's Training Dummy" is printed twice. I've managed to get rid of the first "|Hunit" portion with something like this:

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")

Which returns this:

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.

I then add a second 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.

But the double "Dungeoneer's Training Dummy" string is repeated, obviously.

How could I get rid of the duplicated string? This string can be anything else, in this case is "Dungeoneer's Training Dummy", but it can be the name of any other target.


You can try something like this:

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)

This prints: [13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training Dummy

This code will attempt to extract the name of the target and check if the name is a full duplicate. If the match fails, it returns the original string.

链接地址: http://www.djcxy.com/p/84088.html

上一篇: Spring占位符不解析JavaConfig中的属性

下一篇: 如何使用模式匹配找到重复的字符串?