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

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

( Regexp::Assemble[^ra]で[作りました](http://qiita.com/B73W56H84/items/8fe0db3f5c70ff702d5a) )

### 月日

0101 から 1231 にマッチ[^uruu]する正規表現。
`\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 にマッチ[^uruu]する正規表現。
`\A0(?:3(?:0[123456789]|1\d|20)|2(?:2\d|19))\z`


# サンプル

```php: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:出力
$ 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:	日付ではありません
```

おわりです。

# 参考や注釈

* [PHP での正規表現をマスターする: 第 1 回 Perl は正規表現の王様かもしれませんが、PHP も素早く自在に入力を調べることができます](https://www.ibm.com/developerworks/jp/opensource/library/os-php-regex1/)

* [[PHP]生年月日（誕生日）から星座を調べる](http://php-archive.net/php/12-zodiac-signs/)
* [星座判定(Java) - Qiita](http://qiita.com/AinoMegumi/items/9ac83ee533df3ac14fa0)

* [perl - Regexp::Assembleのススメ](http://blog.livedoor.jp/dankogai/archives/50812865.html)


[^zodiac]: [12星座 - ピクシブ百科事典](http://dic.pixiv.net/a/12%E6%98%9F%E5%BA%A7)

[^ra]: [Regexp::Assemble](http://search.cpan.org/~dland/Regexp-Assemble-0.35/Assemble.pm)

[^uruu]: 0229も入っています。