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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

5回答

1247閲覧

正規表現 12時のよう切りが数字でも正規表現を通過できるようにしたい。

sdfgdfgh

総合スコア2

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/06/01 07:40

編集2020/06/01 08:01

GASの環境で実行しています。
ユーザから値を入力する時に、12時30分のように分がついている状態は問題なく動くのですが、
12時ちょうどの時に12時と入力すると、エラーが出てしまいます。
どのように正規表現を変更すればよいのでしょうか?

javascript

1 const hourMinExp = /([01][1-9]|[1][0-9]|[2][0-4]|[1-9])[:時]([01][0-9]|[2-5][0-9]|[1-9])/; 2 const user12Message = "12時" 3 const matched21 = user12Message.match(hourMinExp); 4 console.log(matched21); 5 const [s, a, d] = matched21 6 console.log(s); console.log(a); console.log(d); 7 const sasas = a + d 8 console.log(("0" + a).slice(-2)); 9 console.log(sasas);

01:10
1:00
のように幅広く通るようにしています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/06/01 07:42

どこまで考えてみましたか?
sdfgdfgh

2020/06/01 07:47

正規表現でかなり簡単な所しか分からないので、 上記に記した、正規表現で初めは良いと思っていましたが、実行してみて12時ピッタリでは無理だったなあと気づきました。 空欄でもOKと言う条件が分かりません。
guest

回答5

0

正規表現は時刻を文字列で取ってくるだけにして、
時刻はJavaScriptでチェックしたらいかがですか?

js

1[ 2 '01:10', '1:00', 3 '12', '12:3,12:3', '12時', '12:0', '12時30分', '12:59', 4 '25', '12:60', '25時', '12時99', '12時61分', '12時66' 5].forEach(timeString => { 6 //[グループと範囲 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges) 7 let hh_mmMatch = /(?<hour>\d{1,2})[時:](?<minutes>\d{0,2})分?/.exec(timeString) || null; 8 9 //[Optional chaining - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining) 10 let [hour, minutes] = [hh_mmMatch?.groups?.hour || Infinity , hh_mmMatch?.groups?.minutes || 0 ]; 11 12 let chkHh_mm = new Date(`2000/1/1 ${ hour }: ${ minutes }`); 13 let chkHh_mmTolerance = new Date("2000/1/1 0:00"); 14 chkHh_mmTolerance.setHours(hour, minutes); 15 console.log(`${timeString} => ${hour} ${minutes}/${chkHh_mm.toLocaleTimeString()}/${chkHh_mmTolerance.toLocaleTimeString()}`); 16}) 17 18

…名前付きキャプチャグループを使ってみたかっただけです

投稿2020/06/01 13:28

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

順番に分解しましょう。
有効な入力は

  1. 時のみ(0~23。ただし00~09も受け付ける)
  2. 時:分(時の部分は 1. と同様。分は 0~59。ただし00~09も受け付ける)

です。


時のみ

0?[0-9]|1[0-9]|2[0-3]

分の部分

:(0?[0-9]|[1-5][0-9])

時が来て、その後ろに0ないし1個の分が来ればよく、全体マッチングさせるので、

^(0?[0-9]|1[0-9]|2[0-3])(:(0?[0-9]|[1-5][0-9]))?$

ですかね。

投稿2020/06/01 10:30

編集2020/06/01 10:36
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/01 11:12 編集

マッチした時に配列に ":" 付きの"分"が余計に含まれますね。私、直しました。
tacsheaven

2020/06/01 23:27

いや、やってみればわかりますけど、配列内に3つに分解されて入ります。 0: 全体 1: 時の部分 2: ":"+分 3: 分 ですから分だけでも取り出せますよ。
退会済みユーザー

退会済みユーザー

2020/06/01 23:39

妙なこだわりなので気にしないでください。2番が邪魔に思えて・・・
guest

0

どうでしょう?

js

1[ 2 '12', '12:3', '12時','12:0','12時30分','12:59', 3 '25', '12:60', '25時', '12時99','12時61分','12時66' 4].forEach (s => 5 console.log (s, /^(0?[0-9]|1[0-9]|2[0-4])(?:[:時](?:(0?[0-9]|[1-5][0-9])(?:分)?)?)?$/.exec (s)); 6) 7

修正しました。

投稿2020/06/01 10:10

編集2020/06/01 10:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • 24時間制っぽいのに「0時XX分」を受け付けないけどいいのか
  • 「XX時10分」を受け付けないけどいいのか(よくないよね)
  • 現在「時」と同じ区切り扱いの「:」については、「XX:」を受け付けるのか

あたりをはっきりさせるといいのでは。

投稿2020/06/01 07:51

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/06/01 08:19

無言で修正されて「XX時10分」は受け付けるようになったな。
guest

0

時間の設定を別に書いて|でつなぐのが一番楽

投稿2020/06/01 07:44

yambejp

総合スコア114968

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/06/01 07:45

> [01][1-9]|[1][0-9] の部分は、ちょっと意味不明 何を通して、何を通さないかもうすこしちゃんとツメたほうがよいでしょう
yambejp

2020/06/01 08:08 編集

いまの条件で通る時間は 01,02,03,04,05,06,07,08,09, 11,12,13,14,15,16,17,18,19, 10, 20,21,22,23,24, 1,2,3,4,5,6,7,8,9 0時とか00時が通らないし、24時とか通るのはNG たとえばこうすれば [01]?[0-9]|[2][0-3] 0,1,2,3,4,5,6,7,8,9, 00,01,02,03,04,05,06,07,08,09, 10,11,12,13,14,15,16,17,18,19, 20,21,22,23 が通ります。 でも時間が01時で、分が1分みたいなフォーマットの差がでるので もっとちゃんと処理しないとだめですけどね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問