3
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+)$,那么输出是正常的。

4

2 回答 2

3

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

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

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

于 2014-01-13T17:48:15.317 回答
3

您的初始模式:

"^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$"
  • 模式中的最后两个捕获缺少+说明符来指示它们要读取 1 个或多个字符。
  • _不是匹配的单词字符%w。您将需要一个字符类,包括_您需要匹配它的任何地方。
  • '在带引号的字符串中转义"是不必要的。

有一些改进:

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

或者:如果你想匹配一组引号内的任何东西',你可以匹配它的逆类:

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

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

于 2014-01-13T17:50:45.063 回答