gpt4 book ai didi

javascript - 特定容易猜到的模式的 RegEx 验证

转载 作者:行者123 更新时间:2023-11-30 10:57:30 26 4
gpt4 key购买 nike

所以我完全不知道从哪里开始在我的 React 应用程序中创建 RegEx 验证模式。

我有各种输入框,其中(取决于特定条件)将有 3、4、5 或 6 位密码(以及相同数量的输入框在屏幕上呈现为每个接受 1 个数字)。

点击SaveContinue按钮后,各个输入被存储在一个数组中,然后join成为一个数.这是我必须验证的最终数字。

我需要做的是编写一个验证方法 - 在 React 中 - 它执行以下验证:

对于 3 位数字:

Cannot be 999, 998, or include 11 immediately after the first digit (911, 611, etc.)

对于 4 位数字:

Cannot be 9999, 9998, or include 11 immediately after the first digit (8112, 5112, etc.)

对于 5 位数字:

Cannot be 99999, 99998, or include 11 immediately after the first digit (71122, 41122, etc.)

对于 6 位数字:

Cannot be 999999, 999998, or include 11 immediately after the first digit (611222, 311222, etc.)

这样做让我很痛苦,但我确实缺乏 RegEx 空间,并且不确定如何着手实现这样的事情。

还应注意,我没有使用 Redux 或随之而来的验证。必须使用接受参数(从输入框中检索到的最终数字)并针对该参数运行验证(如果失败则显示错误消息)的 util 方法来攻击它em>)

是否有人可以就如何着手使用 RegEx 提供一些见解...?

提前致谢!

最佳答案

正如我在您的问题下方的评论中所述,您可以使用以下正则表达式:

See regex in use here

^(?!9+[98]$|\d1{2})\d{3,6}$

工作原理:

  • ^ 在行首断言位置
  • (?!9+[98]$|\d1{2}) 否定前瞻确保以下任一选项不会继续
    • 9+[98]$ 匹配 9 一次或多次,然后是 98,然后是行尾
    • \d1{2}) 匹配任意数字,后跟 1 两次
  • \d{3,6} 匹配 3 到 6 位数字
  • $ 在行尾断言位置

由于负先行跟随行 anchor 的开始,我们还确保先行从该位置开始,这就是 \d1{2} 匹配 011 的原因,111211、...、911 而不是 1211 或其他。

代码如下:

s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']
r = /^(?!9+[98]$|\d1{2})\d{3,6}$/
for (x of s) {
console.log(x.match(r) ? x + ': true' : x + ': false')
}

--

编辑

OP 提到将 999998 放在字符串中的任何位置应该会使它无效:

See regex in use here

^(?!\d*9{2}[98]|\d1{2})\d{3,6}$

与上面相同的正则表达式,除了否定前瞻中的第一个选项。现在是 \d*9{2}[98],匹配 999998 字符串中的任意位置(前面有任意数字) .

s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']
r = /^(?!\d*9{2}[98]|\d1{2})\d{3,6}$/
for (x of s) {
console.log(x.match(r) ? x + ': true' : x + ': false')
}

--

编辑#2

OP 提到 0N11 的格式应该无效(不仅仅是 N11):

See regex in use here

^(?!\d*9{2}[98]|[01]?\d1{2})\d{3,6}$

与上面相同的正则表达式,除了否定前瞻中的第二个选项。现在是 [01]?\d1{2},可选地匹配 01,后跟任何数字,然后是 11(所以 011111211,...,9110011, 0111, 0211, 0311, ..., 0911, 1011, 1111, 1211, ..., 1911).

s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']
r = /^(?!\d*9{2}[98]|[01]?\d1{2})\d{3,6}$/
for (x of s) {
console.log(x.match(r) ? x + ': true' : x + ': false')
}

关于javascript - 特定容易猜到的模式的 RegEx 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59398498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com