0

我在 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
4

1 回答 1

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对捕获的字符的反向引用

以下应用相同逻辑的正则表达式演示希望更具体。

示例代码

于 2018-07-05T06:26:36.790 回答