LPeg模式匹配不包含连续的横线的字符串
2016-10-22 8:31:40
收藏:0
阅读:178
评论:1
我正在尝试编写一个LPeg模式来匹配以下字符串:
- 以字母开头
- 其后包含字母数字字符
- 不包含两个或两个以上的连续横线(例如,不允许
test--string)
参考正则表达式[a-zA-Z](-?[a-zA-Z0-9])*匹配我想要的内容。
以下是我正在使用的代码,仅供参考:
require "lpeg"
P,R,C = lpeg.P,lpeg.R,lpeg.C
dash = P"-"
ucase = R"AZ"
lcase = R"az"
digit = R"09"
letter = ucase + lcase
alphanum = letter + digit
str_match = C(letter * ((dash^-1) * alphanum)^0)
strs = {
"1too",
"too0",
"t-t-t",
"t-t--t",
"t--t-t",
"t-1-t",
"t--t",
"t-one1",
"1-1",
"t-1",
"t",
"tt",
"t1",
"1",
}
for _,v in ipairs(strs) do
if lpeg.match(str_match,v) ~= nil then
print(v," => match!")
else
print(v," => no match")
end
end
但是,令我非常沮丧的是,我得到了以下输出:
1too => no match
too0 => match!
t-t-t => match!
t-t--t => match!
t--t-t => match!
t-1-t => match!
t--t => match!
t-one1 => match!
1-1 => no match
t-1 => match!
t => match!
tt => match!
t1 => match!
1 => no match
不管代码输出是什么,t-t--t、t--t-t和t--t都不应匹配。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

在你的模式
letter * ((dash^-1) * alphanum)^0中,lpeg 会尝试匹配字符串的前缀。对于没有预期匹配的情况加粗部分是你的模式成功匹配的位置。如果没有捕获,
lpeg.match返回它能够使用你的模式解析的最后一个位置(一个数字)。对于这三种情况,都被匹配子部分捕获了,这就解释了你看到的错误输出。如果您只是一个一个地匹配每个字符串,您可以修改您的模式以检查在解析之后是否还有剩余字符。
str_match = C(letter * ((dash^-1) * alphanum)^0) * -1同样可以使用
lpeg.re模块re_pat = re.compile "{ %a ('-'? %w)* } !."对于流匹配或在目标字符串中找到所有模式的出现,堆栈语法规则如下
stream_parse = re.compile [[ stream_match <- ((str_match / skip_nonmatch) delim)* str_match? str_match <- { %a ('-'? %w)* } (&delim / !.) skip_nonmatch <- !str_match (!delim .)* delim <- %s+ ]]任何匹配都将被捕获并返回。如果没有匹配,你将得到
nil或一个数字,表示模式停止解析的字符串位置。编辑: 对于需要在无匹配时返回
nil的情况,这个语法的调整应该可以解决问题stream_parse = re.compile [[ stream_match <- (str_match / skip_nonmatch+ &str_match)+ str_match <- { %a ('-'? %w)* } (&delim / !.) skip_nonmatch <- !str_match (!delim .)* delim delim <- %s+ ]]