ホームページ  >  記事  >  ウェブフロントエンド  >  jsは生年月日の正規表現を検証します

jsは生年月日の正規表現を検証します

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-03 15:41:3611916ブラウズ

今回は生年月日の正規表現のjs検証を紹介します。生年月日の正規表現のjs検証を実装する際の注意事項は何ですか?実際のケースを見てみましょう。

要するに

フォーム検証では、生年月日を検証するために正規表現がよく使用されます。この記事では、生年月日をいくつかの部分に分けて、生年月日認証を実装する完全なプロセスを段階的に紹介します。この記事の内容を理解すると、正規表現の作成に対する理解が深まり、自信が持てるようになると思います。

2018-06-15 の形式の生年月日を年、月、日の 3 つの要素に分割し、それぞれに対応する規則的なルールを記述します。

1 Year Regular

最初に年の正規表現のルール定義を与えます:

  • 年は4桁で構成されます

  • 19と20で始まる年のみを受け入れます

によると上記のルールに従って、年の正規表現を書くのは簡単です:

var pattern = /^(19|20)\d{2}$/;
//输出 true
console.log(pattern.test("2008"));
ここで、 / / 2 つのスラッシュとそれらの間の文字は正規表現リテラルの定義です。 ^ は文字列

の先頭と一致することを意味し、$ は文字列の先頭と一致することを意味します。文字の一致; ^(19|20) は 19 または 20 で始まる文字列の一致を意味し、括弧のペアは複数の項目を 1 つの単位に結合するために使用され、d{2} は任意の ASCII 数値と 2 回一致することを意味します。 、d など。値は [0-9] で、{2} は前の項目と 2 回一致することを意味します。 上記の正規表現は 1900 年から 2099 年までの年に一致します。年の範囲を制限したい場合は、次のルールを追加します:

    年は 1920 年に始まります
  • 年は 2018 年に終わります
  • 上記のルールに従って、正規表現を次のように変更します:
var pattern = /^(19[2-9]\d{1})|(20((0[0-9])|(1[0-8])))$/;
//输出 false
console.log(pattern.test("1916"));
//输出 true
console.log(pattern.test("2008"));
//输出 false
console.log(pattern.test("2022"));

2 月の月の定期 まず、月の正規表現のルール定義を指定します:

    月は 1 ~ 12 です
  • 月が1〜9の場合、前に0を追加できます
  • 上記のルールに従って、次の正規表現と簡単なテストが与えられます:
var pattern = /^((0?[1-9])|(1[0-2]))$/;
//输出 false
console.log(pattern.test("19"));
//输出 true
console.log(pattern.test("02"));
//输出 true
console.log(pattern.test("2"));
//输出 true
console.log(pattern.test("11"));

3 日付の正規まず、日付の正規表現のルール定義が与えられます:

    日付は 1-31 です
  • 日付が 1-9 の場合、その前に 0 を追加できます
  • によると上記の規則、以下の規則規則と簡単なテストが与えられます:
var pattern = /^((0?[1-9])|([1-2][0-9])|30|31)$/;
//输出 false
console.log(pattern.test("32"));
//输出 true
console.log(pattern.test("02"));
//输出 true
console.log(pattern.test("2"));

4つの組み合わせ検証 上記の年規則性、月規則性、日付規則性の組み合わせによると、生年月日の正規表現は上記のテスト結果から、上記の規則性検証は完全ではないことがわかります。主に 2、4、6、9、11 月の日数の問題です。

5 改善点

ステップ4の質問に従って、次のような制限ルールを追加します:

4月、6月、9月、11月には31日はありません

  • 2月は28日あります平年です

  • 2月は29日の閏年です

  • 平年における閏年の判定:

  • 4で割り切れる年は閏年、4で割り切れない年は閏年です4は平年です。しかし、丸 100 年の場合、400 で割り切れる場合のみうるう年となり、それ以外の場合は通常の年となります。

新しいルールと指示に基づいて、次の通常の関数とテストが提供されます:

var checkBirth = function (val) {
  var pattern = /^((?:19[2-9]\d{1})|(?:20(?:(?:0[0-9])|(?:1[0-8]))))\-((?:0?[1-9])|(?:1[0-2]))\-((?:0?[1-9])|(?:[1-2][0-9])|30|31)$/;
  var result = val.match(pattern);
  if(result != null) {
    var iYear = parseInt(result[1]);
    var month = result[2];
    var date = result[3];
    if(/^((0?[469])|11)$/.test(month) && date == '31') {
      return false;
    } else if(parseInt(month) == 2){
      if((iYear % 4 ==0 && iYear % 100 != 0) || (iYear % 400 == 0)) {
        if(date == '29') {
          return true;
        }
      }
      if(parseInt(date) > 28) {
        return false;
      }
    }
    return true;
  }
  return false;
}
//输出 true
console.log(checkBirth("1923-3-18"));
//输出 false 4月份没有31日
console.log(checkBirth("1923-4-31"));
//输出 false 平年
console.log(checkBirth("1923-2-29"));
//输出 true 闰年
console.log(checkBirth("2016-2-29"));

上述正则表达式中利用了String的match()方法,该方法唯一参数是一个正则表达式,返回的是一个由匹配结果组成的数组。数组的第一个元素就是匹配的字符串,余下的元素则是正则表达式中用圆括号括起来的子表达式。而(:?...)这种形式多次出现,该种方式表示只是把项组合到一个单元,但不记忆与该组相匹配的字符。利用该种方法按照正则匹配的顺序分别取出了年月日项,以便后序比较。

根据上述分析与测试,我们不但实现了年月日的正则的一般判定,还实现了日期范围及2,4,6,9,11月等特殊月份天数的处理,测验结果达到了我们设定的目标。

根据上述讲解和分析,我们可以调整相应的限定规则,使其满足于特定场景下的项目需要。

延伸

根据 V2EX网友 xiangyuecn 的意见,上述checkBirth的逻辑代码太多,确实有点 low。现将上述代码更新如下:

var checkBirth = function (val) {
  var pattern = /^((19[2-9]\d{1})|(20((0[0-9])|(1[0-8]))))\-((0?[1-9])|(1[0-2]))\-((0?[1-9])|([1-2][0-9])|30|31)$/;
  if(pattern.test(val)) {
    var date = new Date(val);
    var month = val.substring(val.indexOf("-")+1,val.lastIndexOf("-"));
    return date && (date.getMonth()+1 == parseInt(month));
  }
  return false;
}

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Vue.js中computed与methods使用与区别

js-cookie使用步骤详解

以上がjsは生年月日の正規表現を検証しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。