local querycreate = "create user 'dddqwd123_dwqd'@'localhost'"
local create, usercreate, username, userhost = querycreate:match("^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$")
print(string.format("query: %s", querycreate))
print(string.format(" var create = %s \n var usercreate = %s \n var username = %s \n var userhost = %s", create, usercreate, username, userhost))
query: create user 'dddqwd123_dwqd'@'localhost'
var create = nil
var usercreate = nil
var username = nil
var userhost = nil
我的正则表达式适用于http://regexr.com?37voi。
如果我将其更改为("^(%w+)%s+(%w+)%s+")
,则会输出:
var create = create
var usercreate = user
var username = nil
var userhost = nil
如果我将querycreate
中的引号设为"create user dddqwd123_dwqd @ localhost"
并使用^(%w+)%s+(%w+)%s+(%w+) @ (%w+)$
,则删除引号,则输出正常。
答案 0 :(得分:3)
您在模式中与用户和域匹配的部分上缺少 + 。
您有"^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$"
您需要"^(%w+)%s+(%w+)%s+'([%w_]+)'@'([%w_]+)'$"
(删除不必要的单引号转义并合并@ RyanStein关于 _ 的评论)。
答案 1 :(得分:3)
您的初始模式:
"^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$"
%w
匹配的单词字符。你将需要一个字符类,包括 _ ,无论你需要匹配它。有一些改进:
"^(%w+)%s+(%w+)%s+'([%w_]+)'@'([%w_]+)'$"
或者: 如果您想在一组引号'
中匹配任何,您可以匹配其反向类:
"^(%w+)%s+(%w+)%s+'([^']*)'@'([^']*)'$"
([^']*)
将捕获不是'
的任何内容(包括任何内容),直到字符串结尾或找到'
为止。