【问题标题】:Lua string.match doesn't catch control charactersLua string.match 不捕获控制字符
【发布时间】:2020-10-20 00:21:00
【问题描述】:

尝试修改魔兽插件的代码: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 进行修剪,或者尝试获取任何类型的字符串数组。你能帮帮我吗?

【问题讨论】:

  • 您需要将它们作为单独的字符串还是单个多行字符串?试试local response = string.match(arg1, ".*%[(.*)]");

标签: lua match lua-patterns


【解决方案1】:

您可以使用.*%[(.*)] 匹配最后一个方括号之间的文本,然后匹配匹配中的所有行:

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 demo online

【讨论】:

    【解决方案2】:

    在尝试解决这个问题几个小时后,我发现服务器每行数据都向我发送一个响应。您无法匹配或搜索响应变量之外的任何内容...

    至少在连接 3 个响应之前不会。真的很难做到,因为每个响应都会启动新的代码执行,因为该插件代码用于读取每个服务器响应的类中。

    如果不从头重写插件或重写服务器启动响应的方式,我将无法解决这个问题。

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2013-06-04
      • 1970-01-01
      • 2018-02-03
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多