質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

正規表現を使用した日付、時間の抽出について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,251

score 45

前提・実現したいこと

文章の中から正規表現を用いて日付、時間を検索して抽出したい。
日付や時間は様々な書き方であっても抽出したい。

例として
1.「明日は2017年1月29日です。現在の時刻は14:58です」
2.「明日は2017/01/29です、現在時刻は14時58分です」
このどちらの文章も正規表現で
2017年1月29日,14:58
2017/01/29,14時58分
がマッチするような正規表現を書きたい。

発生している問題・エラーメッセージ

上手く正規表現が書けない。

該当のソースコード

マッチさせたいパターンとそれに対するコードを書いていきます

    $rawData = '上記の例文';
    $datePts = [
            '/^([0-9]{4})\年([0-9]{1,2})\月([0-9]{1,2})日/',  //Y年m月d日
            '/^([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})/',     //Y-m-d
            '/^([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})/',     //Y/m/d
            '/^([0-9]{1,2})\月([0-9]{1,2})日/',  //m月
            '/^([0-9]{1,2})\-([0-9]{1,2})/', //m-d
        ];

        $timePts = [
            '/(?:(2[0-3])|([0-1][0-9])):([0-5][0-9])/',  //H:i
            '/(?:(2[0-3])|([0-1][0-9]))\時([0-5][0-9])\分/'  //H時:i分
        ];
        foreach ($datePts as $pts) {
            preg_match($pts, $rawData, $date);

        }
        foreach ($timePts as $pts) {
            preg_match($pts, $rawData, $time);
        }


正規表現の書き方が悪いのだと思いますが例文で実行すると1の例文ですとデータは何も取得できず、2の例文ですと時間だけ取得出来るのですが、サブマッチで空白のサブマッチが取得出来てしまいます。

正しく正規表現で文字を抽出出来るように。正しい正規表現の書き方を教えて頂けないでしょうか?よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

例示のテキストにはみあたらないyearやらmonthやらdayが正規表現の方で記載されているのですが
実際の例示のテキストには挿入されているのでしょうか?

sample

手を抜いていいならこんな感じ

$pattern="/(\d{4}[年\/]\d{1,2}[月\/]\d{1,2}日*).+?(\d{1,2}[:時]\d{1,2}分*)/u";
$str="1.「明日は2017年1月29日です。現在の時刻は14:58です」";
if(preg_match($pattern,$str,$m)){
  print $m[1].",".$m[2]."<br>";
}
$str="2.「明日は2017/01/29です、現在時刻は14時58分です」 ";
preg_match($pattern,$str,$m);
if(preg_match($pattern,$str,$m)){
  print $m[1].",".$m[2]."<br>";
}


ただし上記patternだと
$str="3.「明日は2017/01月29です、現在時刻は14:58分です」 ";
のような中途半端なものにもマッチしますので、きちんとやるなら以下のように場合分けが必要です

$pattern="/(\d{4}年\d{1,2}月\d{1,2}日|\d{4}\/\d{1,2}\/\d{1,2}).+?(\d{1,2}時\d{1,2}分|\d{1,2}[:]\d{1,2})/u";

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/13 18:31

    ありがとうございます。正規表現が苦手でなかなか思った通りにマッチ出来ずに困っていました。
    参考にさせて頂きます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る