小编典典

特定易猜模式的RegEx验证

reactjs

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

我有各种输入框,其中( 取决于某些条件 )将有一个3、4、5或6位密码( 并且在屏幕上呈现的相同数量的输入框都将接受1个数字 )。

单击s SaveContinue按钮后,单个输入存储在一个数组中,然后joined为一个数字。这是我必须验证的最终数字。

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

3位数字:

不能为999、998,也不能在第一个数字( 911、611等 )后立即包含11

4位数字:

不能为9999、9998,也不能在第一位数字( 8112、5112等 )后立即包含11

5位数字:

不能为 99999、99998,也不能 在第一位数字( 71122、41122等 )后立即包含11

对于6位数字:

不能为999999、999998,也不能在第一位数字( 611222、311222等 )之后立即包含11

这样做让我很痛苦,但是我确实在RegEx领域很缺乏,并且不确定如何实现这样的东西。

还应注意,我没有使用 Redux 或它附带的验证。用接受实参( 从输入框检索到的最终数字) 的util方法来攻击这个对象,并对它运行验证(
如果失败则显示错误信息 )。

是否有人可以提供有关RegEx入门的一些见解…?

提前致谢!


阅读 205

收藏
2020-07-22

共1个答案

小编典典

就像我在您的问题下方的评论中一样,您可以使用以下正则表达式:

查看正则表达式在这里使用

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

这个怎么运作:

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

由于负先行跟随线锚的开始,我们还要确保在该位置先行启动,这就是为什么\d1{2}比赛011111211,…,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提到了这一点,999并将其998放置在字符串中的任何位置均应使其无效:

查看正则表达式在这里使用

^(?!\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):

查看正则表达式在这里使用

^(?!\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')

}
2020-07-22