【问题标题】:Regular Expression Regex for Format MMYY for current year (e.g) 19 and future years in javascript正则表达式正则表达式用于 MMYY 格式的当前年份(例如)19 和未来年份的 javascript
【发布时间】:2019-10-03 05:09:58
【问题描述】:

我需要一个用于信用卡形式的正则表达式 规则很简单,格式必须是MMYY

我可以用这个正则表达式来实现。

/^(0[1-9]|1[0-2])\d{2}$/

现在正在研究应用验证以使当前年份的 YY 为 19 以及未来几年。

也许很难让它动态化,但我可以替换字符串 19 javascript 中的当前年份,所以现在我只想将其固定为 19 岁及以上。

有效 MMYY 示例:

0126

1220

0119

有效 MMYY 示例

0101

1111

1218

这是我现在拥有的参考 Example shared for my reg exp looks like

【问题讨论】:

    标签: javascript regex validation


    【解决方案1】:

    给定那一年和未来几年应该过去的年份,动态构造这样一个正则表达式会有点乏味。考虑改用捕获组,然后只检查捕获的 YY 是否大于或等于限制:

    const yearLimit = 19; // or pass this as an argument if you want
    
    const re = /^(?:0[1-9]|1[0-2])(\d{2})$/;
    const match = str.match(re);
    if (!match) {
      return false;
    }
    const year = Number(match[1]);
    return year >= yearLimit;
    

    const validate = (str) => {
      const yearLimit = 19; // or pass this as an argument if you want
    
      const re = /^(?:0[1-9]|1[0-2])(\d{2})$/;
      const match = str.match(re);
      if (!match) {
        return false;
      }
      const year = Number(match[1]);
      return year >= yearLimit;
    };
    
    console.log(
      validate('1234'),
      validate('1212')
    );

    ^(?:0[1-9]|1[0-2])(\d{2})$ 表示

    • ^ - 匹配字符串开头
    • (?:0[1-9]|1[0-2]) - 比赛 01-12:要么
      • 0[1-9] - 前导 0,后跟数字 1 到 9,或
      • 1[0-2] - 前导 1,后跟数字 0 到 2
    • (\d{2}) - 匹配并捕获任意两位数
    • $ - 匹配字符串结尾

    【讨论】:

    • 我相信它在 0101 检查你的 reg 表达式时失败了,我在这里测试了 regex101.com/r/sPaRXh/1
    • 对年份的测试是在模式匹配之后完成的,在提取的捕获组的测试中。如果您将0101 放入sn-p,verify 将根据需要返回false
    • 我喜欢你的风格,这也是另一个测试codepen.io/shareefhiasat/pen/qBBWBKX
    • 你能通过解释正则表达式来改进答案吗,因为这是这个问题的开始......
    【解决方案2】:

    如果您只想通过正则表达式解决,下面的代码将起作用。

    const currentYear = 19;
    const currentDecade = currentYear/10;
    const unitPlaceCurrentYear = currentYear%10;
    regex_string = `^(0[1-9]|1[0-2])(1[${unitPlaceCurrentYear}-9]|[${currentDecade+1}-9][0-9])$`
    
    var re = new RegExp(regex_string);
    
    inputs = ['0126','1220','0119','0101','1111','1218'];
    inputs.map((str) => {
      let match = str.match(re);
      if (match) console.log('matched: ' + str);
      else console.log('Did not match: ' + str);
    });

    【讨论】:

      【解决方案3】:

      这是您答案的动态解决方案

          var date = new Date()
          var a = date.getFullYear().toString().substr(2,2).split('')
          var monthRegex = "(0[1-9]|1[0-2])"
          var yearRegex1 = "([" + a[0] + "-9][" + a[1] + "-9])"
          var yearRegex2 = "([" + (parseInt(a[0], 10) + 1) + "-9][0-9])"
      
          var regex2 = new RegExp("^" + monthRegex + yearRegex1 + "|" + yearRegex2 + "$");
          
          console.log(regex2.test('1218'))
          console.log(regex2.test('1219'))
          console.log(regex2.test('1239'))

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多