Lua string.match 不会匹配控制字符

尝试修改 WoW 插件代码:https://github.com/chocochaos/GMGenie 以获取更多信息。

文本大致如下:

cff00ff00Ticket: 6969. cff00ff00Created by: Me cff00ff00Created: 57m32s ago cff00ff00Last change: 57m32s ago cff00ff00Ticket Message: [asd] cff00ff00Ticket Response: [answer 1
answer 2
answer3
]

我想要获取最后括号内的行([,]),但此代码仅获取第一个答案并忽略其他两个。

local response = string.match(arg1, "%|cff00ff00Ticket%sResponse%|r:%s%[(.*)");

此代码也可以工作:获取另一个变量:

local ticketId, name, createStr, lastModifiedStr, rest = string.match(arg1, "^%|cffaaffaaTicket%|r:%|cffaaccff%s([0-9]+).%|r%s%|cff00ff00Created%sby%|r:%|cff00ccff%s(.+)%|r%s%|cff00ff00Created%|r:%|cff00ccff%s([a-zA-Z0-9%s]+)%sago%|r%s%|cff00ff00Last%schange%|r:%|cff00ccff%s([a-zA-Z0-9%s]+)%sago%|r%s(.*)$");

我知道行之间的分隔符是 "\n"。 我尝试修改 (.*) 模式以添加所有行直到最后一个括号(]),使用以下内容:

local response, response2 = string.match(arg1, "%|cff00ff00Ticket%sResponse%|r:%s%\[(.*)+");

但它不起作用。我不知道哪个更好:尝试获取相同字符串中的所有字符并使用gsub进行截断,还是尝试获取任何类型的字符串数组。你能帮我吗?

点赞
用户3832970
用户3832970

你可以使用.*%[(.*)]匹配最后一对方括号之间的文本并且匹配其中所有行:

local arg1 = "cff00ff00Ticket: 6969. cff00ff00Created by: Me cff00ff00Created: 57m32s ago cff00ff00Last change: 57m32s ago cff00ff00Ticket Message: [asd] cff00ff00Ticket Response: [answer 1\nanswer 2\nanswer3\n]"
local response = string.match(arg1, ".*%[(.*)]");
answer_lines = {}
for s in response:gmatch("[^\r\n]+") do
    table.insert(answer_lines, s)
end

查看在线 Lua 演示

2020-06-29 19:01:34
用户3357350
用户3357350

经过几个小时的尝试解决,我发现服务器为每行数据发送一个响应。在合并三个响应之前,您无法匹配或搜索响应变量之外的任何内容......至少在添上三个响应之前是很难做的。这是因为每个响应都会启动新的代码执行,因为该插件代码是在读取每个服务器响应的类中使用的。

我认为,如果不重新编写插件或更改服务器启动响应的方式,这个问题是无法解决的。

2020-08-29 17:57:21