LoginSignup
22
24

More than 5 years have passed since last update.

誕生日から星座を調べる正規表現

Last updated at Posted at 2015-10-25

mmddの形式の誕生日から、星座1を求める正規表現。

( Regexp::Assemble2作りました )

月日

0101 から 1231 にマッチ3する正規表現。
\A(?:0(?:[13578](?:0[123456789]|[12]\d|3[01])|[469](?:0[123456789]|[12]\d|30)|2(?:0[123456789]|[12]\d))|1(?:[02](?:0[123456789]|[12]\d|3[01])|1(?:0[123456789]|[12]\d|30)))\z

牡羊座

0321 から 0419 にマッチする正規表現。
\A0(?:3(?:2[123456789]|3[01])|4(?:0[123456789]|1\d))\z

牡牛座

0420 から 0520 にマッチする正規表現。
\A0(?:5(?:0[123456789]|1\d|20)|4(?:2\d|30))\z

双子座

0521 から 0621 にマッチする正規表現。
\A0(?:6(?:0[123456789]|2[01]|1\d)|5(?:2[123456789]|3[01]))\z

蟹座

0622 から 0722 にマッチする正規表現。
\A0(?:7(?:0[123456789]|2[012]|1\d)|6(?:2[23456789]|30))\z

獅子座

0723 から 0822 にマッチする正規表現。
\A0(?:8(?:0[123456789]|2[012]|1\d)|7(?:2[3456789]|3[01]))\z

乙女座

0823 から 0922 にマッチする正規表現。
\A0(?:9(?:0[123456789]|2[012]|1\d)|8(?:2[3456789]|3[01]))\z

天秤座

0923 から 1023 にマッチする正規表現。
\A(?:10(?:0[123456789]|2[0123]|1\d)|09(?:2[3456789]|30))\z

蠍座

1024 から 1121 にマッチする正規表現。
\A1(?:1(?:0[123456789]|2[01]|1\d)|0(?:2[456789]|3[01]))\z

射手座

1122 から 1221 にマッチする正規表現。
\A1(?:2(?:0[123456789]|2[01]|1\d)|1(?:2[23456789]|30))\z

山羊座

1222 から 0119 にマッチする正規表現。
\A(?:12(?:2[23456789]|3[01])|01(?:0[123456789]|1\d))\z

水瓶座

0120 から 0218 にマッチする正規表現。
\A0(?:2(?:0[123456789]|1[012345678])|1(?:3[01]|2\d))\z

魚座

0219 から 0320 にマッチ3する正規表現。
\A0(?:3(?:0[123456789]|1\d|20)|2(?:2\d|19))\z

サンプル

test_regexp.php
<?php

error_reporting(-1);

array_shift($argv);
foreach ($argv as $day) {
    print $day.":\t";
    if (preg_match("/\A(?:0(?:[13578](?:0[123456789]|[12]\d|3[01])|[469](?:0[123456789]|[12]\d|30)|2(?:0[123456789]|[12]\d))|1(?:[02](?:0[123456789]|[12]\d|3[01])|1(?:0[123456789]|[12]\d|30)))\z/", $day)) {
        print '日付です'.PHP_EOL;

        if (preg_match("/\A0(?:3(?:2[123456789]|3[01])|4(?:0[123456789]|1\d))\z/", $day)) {
            print '牡羊座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:5(?:0[123456789]|1\d|20)|4(?:2\d|30))\z/", $day)) {
            print '牡牛座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:6(?:0[123456789]|2[01]|1\d)|5(?:2[123456789]|3[01]))\z/", $day)) {
            print '双子座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:7(?:0[123456789]|2[012]|1\d)|6(?:2[23456789]|30))\z/", $day)) {
            print '蟹座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:8(?:0[123456789]|2[012]|1\d)|7(?:2[3456789]|3[01]))\z/", $day)) {
            print '獅子座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:9(?:0[123456789]|2[012]|1\d)|8(?:2[3456789]|3[01]))\z/", $day)) {
            print '乙女座'.PHP_EOL;
        }

        if (preg_match("/\A(?:10(?:0[123456789]|2[0123]|1\d)|09(?:2[3456789]|30))\z/", $day)) {
            print '天秤座'.PHP_EOL;
        }

        if (preg_match("/\A1(?:1(?:0[123456789]|2[01]|1\d)|0(?:2[456789]|3[01]))\z/", $day)) {
            print '蟹座'.PHP_EOL;
        }

        if (preg_match("/\A1(?:2(?:0[123456789]|2[01]|1\d)|1(?:2[23456789]|30))\z/", $day)) {
            print '射手座'.PHP_EOL;
        }

        if (preg_match("/\A(?:12(?:2[23456789]|3[01])|01(?:0[123456789]|1\d))\z/", $day)) {
            print '山羊座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:2(?:0[123456789]|1[012345678])|1(?:3[01]|2\d))\z/", $day)) {
            print '水瓶座'.PHP_EOL;
        }

        if (preg_match("/\A0(?:3(?:0[123456789]|1\d|20)|2(?:2\d|19))\z/", $day)) {
            print '魚座'.PHP_EOL;
        }
    } else {
        print '日付ではありません'.PHP_EOL;
    }
}
出力
$ php -v
PHP 5.6.14 (cli) (built: Oct  3 2015 14:54:13)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies


$ php test_regexp.php 9999 1020 0505 0214 1224 0931
9999:   日付ではありません
1020:   日付です
天秤座
0505:   日付です
牡牛座
0214:   日付です
水瓶座
1224:   日付です
山羊座
0931:   日付ではありません

おわりです。

参考や注釈

22
24
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
24