在 luci 中检查前 8 个字符是否相同的字符串模式

我在 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
点赞
用户8291949
用户8291949

你问题的核心是:

前8个字符不相同

建议使用 Lua 模式(与 regex 类似)检查。如果您想要检查前8个字符是否都相同,可以使用以下方法:

function validate1st8NotSame(value)
    if value:match("^(.)%1%1%1%1%1%1%1") then
      return false
    end
    return true
end

print(validate1st8NotSame("aaaaaaaa")) --无效
print(validate1st8NotSame("aaaaaaab")) --有效
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")) --有效
print(validate1st8NoSame("abcdefgae")) --无效

这里的想法是:

  • value:sub(1,8) 获取前8个字符
  • (.) 捕获一个字符
  • .- 匹配最短的可能重复 0 个或多个字符的序列;
  • %1 回溯引用捕获的字符

以下 regex demo 应用了相同的逻辑,希望使其更具体化。

示例代码

2018-07-05 06:26:36