我在openWRT中使用Luci-Lua。我需要一个函数来验证只接受字母数字的密码字段,前8个字符不相同。请检查我的代码并帮助我。
function pw1.validate(self, value)
if #value <= 6 and not value:find('^[%-%.%w]+$') then
return nil
end
if value:match("^(.)\1*$") then
return nil
end
return value
end
答案 0 :(得分:0)
您的问题的中心点是:您的问题的顶峰是
前8个字符不同
如建议的那样,可以使用Lua模式(类似于正则表达式)完成此操作。 如果要检查前8个字符是否都相同
function validate1st8NotSame(value)
if value:match("^(.)%1%1%1%1%1%1%1") then
return false
end
return true
end
print(validate1st8NotSame("aaaaaaaa")) --not valid
print(validate1st8NotSame("aaaaaaab")) --valid
print(validate1st8NotSame("aaaaaaa")) --!?
该模式如下:
^(.)
捕获位置1处的字符,%1%1%1%1%1%1%1
使用向后引用%1
来检查捕获重复次数8次。如果您实际上要检查前8个字符是否不包含相同字符,则需要更复杂的模式:
function validate1st8NoSame(value)
if value:sub(1,8):match("(.).-%1") then
return false
end
return true
end
print(validate1st8NoSame("abcdefghe")) --valid
print(validate1st8NoSame("abcdefgae")) --invalid
这里的想法是:
value:sub(1,8)
获得前8个字符(.)
捕获一个字符.-
匹配任何字符的0个或多个重复的最短序列; %1
反向引用捕获的字符希望采用相同逻辑的以下正则表达式demo更明显。