为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式检测具有2+数字和2+字符的单词

正则表达式检测具有2+数字和2+字符的单词

手掌心 2019-04-11 14:15:04
我需要一个正则表达式来检测长度为8个字符的单词,其中包含2个以上的数字和2个以上的字符(没有特殊字符)。我接近解决方案,我在regex101.com上做了正则表达式。问题是包含一个数字的单词对我的正则表达式来说不应该是相关的。我丢弃了包含最少7个字符的字符的所有单词(?![A-Za-z]{7,})。我丢弃了包含最少7个数字的数字的所有单词(?![\d]{7,})。我丢弃了包含最少2个数字和2个字符的单词(?=[a-zA-Z\d]{2})[A-Za-z\d]{8}。为什么vaff8loe匹配?我创建了这个正则表达式,因为在我用*******替换整个单词之后。喜欢:papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y更换后(“正则表达式”,“********”)********ciao il mio pin papaver1 è reeredji332ji con ******** 1234567o ******** papavero 9o ********
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

在你需要为你的解析应用这么多条件的情况下(单词必须有长度== 8,2个字母字符,2个以上数字字符,没有特殊字符),我认为你应该努力寻找你可以阅读的解决方案而不是扔一切复杂的正则表达式中的一切。

您的代码将如下所示:

let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";


s = s.replace(/\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\b/g, "********");


console.log(s);

目前还不清楚你在这里做了什么,最终的错误和/或逻辑的变化将难以维持。相反,您可以利用函数替换参数来细分规则。你会有这样的事情:

let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";


// The first regex filters only 8-length words

s = s.replace(/\b\w{8}\b/g, 

    function(fullMatch) {

      // .match() can return null if no match is found, 

      // so I'm accounting for this.

      const digitMatch = fullMatch.match(/\d/g) || [];

      const letterMatch = fullMatch.match(/[a-zA-Z]/g) || [];

      const specialCharMatch = fullMatch.match(/\[^a-zA-Z0-9]/g);


      if (digitMatch.length >= 2

       && letterMatch.length >= 2

       && specialCharMatch === null) {

        return "********";

       } else {

        return fullMatch;

       }

  });


console.log(s);

它更冗长,但也更具可读性和可调试性。


希望能帮助到你!


查看完整回答
反对 回复 2019-05-17
  • 3 回答
  • 0 关注
  • 580 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信