見出し画像

【GAS】正規表現で日付表示を拾ってみた(自分用メモ)

概要

GASのコードの中で正規表現を使って、googleカレンダーに記載された文字列のうちの特定の部分を消す、という作業をする必要があり、正規表現について少し勉強してみましたので、備忘をこちらに置いておこうと思います。
正規表現が正しいかどうかの判定は、こちらのサイトのお世話になりました。

学習記録ですので、何かお気づきの点がおありでしたら、ご指摘いただけますと幸いです。
【2022/9/23追記】正規表現チェッカーの対応ページのURLに誤りがありましたので修正しました。申し訳ございませんでした。

この文字列を探してみた

今回マッチを試みた文字列は、以下です。(どちらかに該当すればマッチ)

#元期限#yyyy-mm-dd hh:mm
 または、
#Color#xx

ただし、xxは数字で1桁または2桁とし、
y,m,d,h,mはそれぞれ年月日時分秒に使われるアラビア数字とします。

つまり、カレンダーに
「TODO:月次報告書作成#元期限#2022-09-22 12:00#Color#02」
という対象の文字列があった場合、
「#元期限#2022-09-22 12:00」
または
「#Color#02」
をマッチさせる、という作業をします。

いきなりでは難しかったので、以下のように順を追って考えてみました。Step4のようにすれば、どうやら上記の文字列をマッチできそうに思います。

Step1

#ではさまれた最短一致をマッチする実験
(間の部分に#を含まない、と指定する[^#]を挿入することにより、最短一致にする)

正規表現  /#[^#]*#/g
対象の文字列 TODO:月次報告書作成#元期限#2022-09-22 12:00#Color#02

正規表現チェッカーでの確認結果
https://www-creators.com/tool/regex-checker?r=%23%5B%5E%23%5D*%23&f=g

Step2

#元期限#または#Color#をマッチする実験

正規表現  /#(元期限|Color)#/g
対象の文字列 TODO:月次報告書作成#元期限#2022-09-22 12:00#Color#02

正規表現チェッカーでの確認結果
https://www-creators.com/tool/regex-checker?r=%23(%E5%85%83%E6%9C%9F%E9%99%90%7CColor)%23&f=g

Step3

#元期限#yyyy-mm-dd hh:mmまたは#Color#xx(xxは数字で1桁または2桁)をマッチする実験(y,m,d,h,m,xはアラビア数字であればOKとする簡略版)

正規表現  /#(元期限#\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}|Color#\d\d?)/g
対象の文字列 TODO:月次報告書作成#元期限#2022-09-22 12:00#Color#02

正規表現チェッカーでの確認結果
https://www-creators.com/tool/regex-checker?r=%23(%E5%85%83%E6%9C%9F%E9%99%90%23%5Cd%7B4%7D-%5Cd%7B2%7D-%5Cd%7B2%7D%5Cs%5Cd%7B2%7D%3A%5Cd%7B2%7D%7CColor%23%5Cd%5Cd%3F)&f=g

Step4

#元期限#yyyy-mm-dd hh:mmまたは#Color#xx(xxは数字で1桁または2桁)をマッチする(y,m,d,h,mは時分秒に限定されたアラビア数字とする厳密版)

正規表現   /#(元期限#\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\s(0[1-9]|1[0-2]):(0[0-9]|[12345][0-9])|Color#\d\d?)/g
対象の文字列 TODO:月次報告書作成#元期限#2022-09-22 12:00#Color#02

正規表現チェッカーでの確認結果
https://www-creators.com/tool/regex-checker?r=%23(%E5%85%83%E6%9C%9F%E9%99%90%23%5Cd%7B4%7D-(0%5B1-9%5D%7C1%5B0-2%5D)-(0%5B1-9%5D%7C%5B12%5D%5B0-9%5D%7C3%5B01%5D)%5Cs(0%5B1-9%5D%7C1%5B0-2%5D)%3A(0%5B0-9%5D%7C%5B12345%5D%5B0-9%5D)%7CColor%23%5Cd%5Cd%3F)&f=g

関連する正規表現の基本メモ

参照したサイト

MDN https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

前提条件 - 最短一致と最長一致

こちらのサイトの説明が分かりやすかったので、引用させていただきます。
https://www-creators.com/archives/1804

通常、正規表現では、「*」などの量指定子を利用してマッチを検出した時、「最長一致」を検出します…
(中略)
正規表現での「*」「+」「?」「{n}」などの量指定子(Quantifier)は、文字、文字クラスやサブパターン、またはメタ文字などの後ろにくっつけることで、「文字の繰り返し」を表現できるのはよく知られています。
このとき、量指定子はデフォルトでは「Greedy(欲張り)なマッチ」を行う仕様となっており、可能な限り長い文字列のマッチを探してしまいます。
そのような量指定子の直後に「?」を置くことで、逆に「Non-greedy(最短)なマッチ」を表現でき、可能な限り短い文字列のマッチ、すなわち最短マッチを検出するようになります。(WWW.CREATORS)

WWW.CREATORS  

その他

MDN(https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)より引用

. 次のいずれかの意味を持ちます。
行末文字 ( \\n、\\r、\\u2028、\\u2029 ) を除くあらゆる 1 文字とマッチします。例えば、/.y/ は "my" と "ay" にマッチし、"yes make my day" の "yes" にはマッチしません。
文字セット内では . はその特別な意味を失い、文字通りの "."と一致します。複数行フラグ (m) は "." の意味を変えないことに注意してください。そのため、複数行にわたるパターンに一致させるには、(IEの古いバージョン以外なら)文字集合 [^] を使うことで、改行を含む任意の文字に一致します。
ES2018 では s "dotAll" フラグが追加されました。これは行末文字と一致することを可能にします。

(MDN)

\d あらゆる(アラビア)数字にマッチします。[0-9] に相当します。例えば /\\d/ や /[0-9]/ は "B2 is the suite number" の "2" にマッチします。

(MDN)

x*  直前の項目 "x" の 0 回以上の繰り返しに一致します。例えば /bo*/ は "A ghost booooed" の "boooo" や "A bird warbled" の "b" に一致しますが、 "A goat grunted" には一致しません。

(MDN)

x+ 直前の項目 "x" の 1 回以上の繰り返しに一致します。{1,} と同等です。例えば /a+/ は "candy" の "a" や "caaaaaaandy" のすべての "a" に一致します。

(MDN)

x{n} "n" には正の整数が入ります。直前の項目 "x" がちょうど "n" 回出現するものに一致します。例えば /a{2}/ は "candy" の "a" には一致しませんが、"caaandy" の最初の 2 個の "a" には一致します。

(MDN)

この記事が気に入ったらサポートをしてみませんか?