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

时间:2018-04-25 10:16:39

标签: regex string lua openwrt luci

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

1 个答案:

答案 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更明显。

Sample Code