Javascript 针对特定易猜测模式的正则表达式验证

Javascript 针对特定易猜测模式的正则表达式验证,javascript,regex,reactjs,validation,Javascript,Regex,Reactjs,Validation,所以我完全不知道从哪里开始在我的React应用程序中创建正则表达式验证模式 我有各种输入框,其中(取决于某些标准)将有3、4、5或6位密码(屏幕上呈现的相同数量的输入框每个接受1个数字) 单击sSave或Continue按钮后,各个输入存储在一个数组中,然后将join合并为一个数字。这是我必须验证的最后一个数字 我需要做的是在React中编写一个验证方法,它执行以下验证: 对于3位数字: 不能是999、998或在第一个数字(911、611等)后立即包含11 对于4位数字: 不能是9999、999

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

我有各种输入框,其中(取决于某些标准)将有3、4、5或6位密码(屏幕上呈现的相同数量的输入框每个接受1个数字)

单击s
Save
Continue
按钮后,各个输入存储在一个数组中,然后将
join
合并为一个数字。这是我必须验证的最后一个数字

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

对于3位数字:

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

对于4位数字:

不能是9999、9998或在第一个数字(8112、5112等)后立即包含11

对于5位数字:

不能是999999、99998,或在第一个数字(71122、41122等)后立即包含11

对于6位数字:

不能是9999999、999998,也不能在第一个数字(611222、311222等)后立即包含11

这样做让我很痛苦,但我确实缺乏正则表达式空间,并且不确定如何着手实现这样的东西

还应该注意的是,我没有使用Redux或它附带的验证。必须使用接受参数(从输入框中检索到的最终数字)并针对该参数运行验证(如果出现故障,则显示错误消息)的util方法来攻击此参数

有没有人可以提供一些关于如何开始使用RegEx


提前谢谢

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

工作原理:

  • ^
    在行首断言位置
  • (?!9+[98]$|\d1{2})
    负前瞻确保以下任一选项不继续
    • 9+[98]$
      匹配
      9
      一次或多次,然后是
      9
      8
      ,然后是行尾
    • \d1{2})
      匹配任何数字,后跟
      1
      两次
  • \d{3,6}
    在3到6位之间匹配
  • $
    在行尾断言位置
由于消极的前瞻紧跟着线锚的开始,我们也确保前瞻开始于那个位置,这就是为什么
\d1{2}
匹配
011
111
211
,…,
911
而不是
1211
或其他

代码如下:

s=['999'、'998'、'911'、'611'、'9999'、'9998'、'8112'、'5112'、'99999'、'99998'、'71122'、'41122'、'999999'、'99998'、'99998'、'611122'、'123'、'6211'、'99989'、'121212']
r=/^(?9+[98]$|\d1{2})\d{3,6}$/
适用于(x/s){
console.log(x.match(r)?x+':真:x+':假)

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

工作原理:

  • ^
    在行首断言位置
  • (?!9+[98]$|\d1{2})
    负前瞻确保以下任一选项不继续
    • 9+[98]$
      匹配
      9
      一次或多次,然后是
      9
      8
      ,然后是行尾
    • \d1{2})
      匹配任何数字,后跟
      1
      两次
  • \d{3,6}
    在3到6位之间匹配
  • $
    在行尾断言位置
由于消极的前瞻紧跟着线锚的开始,我们也确保前瞻开始于那个位置,这就是为什么
\d1{2}
匹配
011
111
211
,…,
911
而不是
1211
或其他

代码如下:

s=['999'、'998'、'911'、'611'、'9999'、'9998'、'8112'、'5112'、'99999'、'99998'、'71122'、'41122'、'999999'、'99998'、'99998'、'611122'、'123'、'6211'、'99989'、'121212']
r=/^(?9+[98]$|\d1{2})\d{3,6}$/
适用于(x/s){
console.log(x.match(r)?x+':真:x+':假)

}
^(?9+[98]$\d1{2})\d{3,6}$
天哪!太快了!你应该把它写下来作为一个答案,这样我就可以接受它了,因为它似乎满足了我的需要…
^(?!9+[98]$$\d1{2})\d{3,6}$
天哪!太快了!你应该把它写下来作为一个答案,这样我就可以接受它,因为它似乎满足了我的需要…谢谢你解释所有这些!我在您的代码片段中看到—运行后—数字99989返回为
true
,但这是不允许的,因此它应该返回为失败(
false
),任何不允许的数字组合都会使整个验证失败。因此,即使6位数字以999开头,也会立即导致故障。这有意义吗?你能更清楚地定义规则吗?根据你的例子,只有数字是9的一次或多次,然后是9或8。此后,我将相应地更改我的答案。例如,如果用户要输入6位扩展名,如果在该6位数字中的任何位置发现
999
(或任何其他不允许的模式),则验证应失败。这里有
999
失败(这是正确的),但是
99989
通过了,它不应该通过,因为
999
的模式在
99989
中找到,因此它应该自动失败。希望能把它清理干净…那么
[01]?\d11
对这种情况有效(可选
0
1
,然后是任意数字,然后是
11
)?感谢您的解释!我在您的代码片段中看到—运行之后—编号99989来自bac
^(?!9+[98]$|\d1{2})\d{3,6}$