为什么这个Lua模式不起作用?

时间:2014-01-13 17:38:46

标签: lua quotes lua-patterns

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+)$,则删除引号,则输出正常。

2 个答案:

答案 0 :(得分:3)

您在模式中与用户和域匹配的部分上缺少 +

您有"^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$"

您需要"^(%w+)%s+(%w+)%s+'([%w_]+)'@'([%w_]+)'$"(删除不必要的单引号转义并合并@ RyanStein关于 _ 的评论)。

答案 1 :(得分:3)

您的初始模式:

"^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$"
  • 模式中的最后两个捕获缺少 + 说明符,表示它们要读取1个或多个字符。
  • _ 不是由%w匹配的单词字符。你将需要一个字符类,包括 _ ,无论你需要匹配它。
  • 引用的字符串中转义'是不必要的。

有一些改进:

"^(%w+)%s+(%w+)%s+'([%w_]+)'@'([%w_]+)'$"

或者: 如果您想在一组引号'中匹配任何,您可以匹配其反向类:

"^(%w+)%s+(%w+)%s+'([^']*)'@'([^']*)'$"

([^']*)将捕获不是'的任何内容(包括任何内容),直到字符串结尾或找到'为止。