Lua string.match 不捕获控制字符
Lua string.match doesn't catch control characters
正在尝试修改 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
]
我想获取最后一个括号 ([]) 之间的行。此代码仅获得第一个答案而忽略其他 2.
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 获取同一个字符串和 trim 中的所有字符,或者尝试获取任何类型的字符串数组。你能帮帮我吗?
您可以使用 .*%[(.*)]
匹配最后一个方括号之间的文本,然后匹配匹配项中的所有行:
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
在尝试解决这个问题几个小时后,我发现服务器对每一行数据都向我发送了一个响应。您无法匹配或搜索响应变量之外的任何内容...
至少在连接 3 个响应之前不会。真的很难做到,因为每个响应都会启动一个新的代码执行,因为该插件代码用于读取每个服务器响应的class。
如果不从头重写插件或重写服务器启动响应的方式,我将把这个问题视为无法解决。
正在尝试修改 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
]
我想获取最后一个括号 ([]) 之间的行。此代码仅获得第一个答案而忽略其他 2.
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 获取同一个字符串和 trim 中的所有字符,或者尝试获取任何类型的字符串数组。你能帮帮我吗?
您可以使用 .*%[(.*)]
匹配最后一个方括号之间的文本,然后匹配匹配项中的所有行:
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
在尝试解决这个问题几个小时后,我发现服务器对每一行数据都向我发送了一个响应。您无法匹配或搜索响应变量之外的任何内容...
至少在连接 3 个响应之前不会。真的很难做到,因为每个响应都会启动一个新的代码执行,因为该插件代码用于读取每个服务器响应的class。
如果不从头重写插件或重写服务器启动响应的方式,我将把这个问题视为无法解决。