2015-03-19 16 views
7

Tôi có một chuỗi tương tự như sau:Cách tìm chuỗi trùng lặp với Ghép mẫu?

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

Trong trường hợp bạn tự hỏi, đó là từ World of Warcraft.

Tôi muốn kết thúc với một cái gì đó như thế này:

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

Nếu bạn nhận thấy, "Đào tạo Dummy Dungeoneer của" được in hai lần. Tôi đã quản lý để thoát khỏi những người đầu tiên "| Hunit" phần với một cái gì đó như thế này:

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

nào trả về này:

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. 

tôi sau đó thêm một gsub thứ hai:

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. 

Tuy nhiên, chuỗi kép "Dungeon đào tạo giả" được lặp đi lặp lại, rõ ràng.

Làm cách nào để loại bỏ chuỗi trùng lặp? Chuỗi này có thể là bất cứ thứ gì khác, trong trường hợp này là "Dummy Training Dummy" của Dungeoneer, nhưng nó có thể là tên của bất kỳ mục tiêu nào khác.

Trả lời

4

Bạn có thể thử một cái gì đó như thế này:

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) 

này in: [13:41:25] [100:Devnull]: 01:41:20, 13:41:21> Your [Chimaera Shot] hit Dungeoneer's Training Dummy

Mã này sẽ cố gắng trích xuất tên của các mục tiêu và kiểm tra xem tên của nó là một bản sao đầy đủ. Nếu không khớp, nó sẽ trả về chuỗi gốc.

+0

Điều đó xảy ra, mặc dù tôi vẫn yêu cầu dấu "33265 Thiên nhiên". Bạn có thể giải thích những gì xảy ra trong hàm bạn đã sử dụng không? Nếu không có nhiều rắc rối. – user3209270

+0

Sau khi 33265 Thiên nhiên bị xóa, hàm sẽ kiểm tra xem chuỗi hiện tại có thể được chia thành hai nửa và kiểm tra xem hai nửa đó có giống nhau hay không. Tôi sẽ thêm ý kiến ​​khác ... –

+0

Cập nhật giải pháp để giữ cho '33265 Nature' trong đó. –

Các vấn đề liên quan