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

本地查询创建语句为create user 'dddqwd123_dwqd'@'localhost'

通过querycreate:match("^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$")的正则表达式匹配到值并赋予变量。

输出createusercreateusernameuserhost的值。

输出结果:

query: create user 'dddqwd123_dwqd'@'localhost'

var create = create

var usercreate = user

var username = d

var userhost = l

正则表达式在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+)$的正则表达式,则输出正常。

点赞
用户258523
用户258523

你在匹配用户和域名的模式部分缺少了 +

你写的是 "^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$",需要改成 "^(%w+)%s+(%w+)%s+'([%w_]+)'@'([%w_]+)'$"(去掉了不必要的单引号转义,并参考了@RyanStein的评论加入了 _)。

2014-01-13 17:48:15
用户828255
用户828255

你的初始模式:

"^(%w+)%s+(%w+)%s+\'(%w)\'@\'(%w)\'$"
  • 你模式中的最后两个捕获没有使用 + 说明符来表示它们需要读取 1 个或多个字符。
  • 下划线 _ 不是与 %w 匹配的单词字符。你需要使用字符类来包含 _,以便在需要匹配它的任何位置上使用。
  • " 引用字符串中转义 ' 是不必要的。

通过一些改进:

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

或者: 如果你想匹配引号 ' 中的 任何 字符,你可以匹配其反向类:

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

([^']*) 将捕获任何(包括空字符串)不是 ' 的字符,直到字符串的末尾或找到 '

2014-01-13 17:50:45