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

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+)$来移除引号,则输出是正常的。
2个回答

3

您的初始模式:

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

稍作改进:

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

或者:如果您想匹配引号'中的任何内容,可以使用其反向类进行匹配:

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

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


3

您需要在匹配用户和域的部分缺少 +

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

您需要 "^(%w+)%s+(%w+)%s+'([%w_]+)'@'([%w_]+)'$"(去掉不必要的单引号转义,并结合 @RyanStein 的评论考虑 _)。


3
无需转义单引号 ' - lhf
没错。我本来想评论一下,但被其他事情分心了。谢谢@lhf。 - Etan Reisner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接