VBAをオブジェクト指向で書けるようになりたい、と思っており、オブジェクト指向のほかの言語も勉強してみるか、と思って、最近「pythonスタートブック」「退屈な仕事はpythonにやらせよう」等を読んでみた(どちらも途中)
その中で「正規表現」というものがでてくる。なんのことやら、何のために使うのかさっぱりわからない。読んでいると眠くなる。。。
そうゆうものがあるんだなあ、でも私の脳みその限界を超えるものだからスルーしようとしていました。
しかし、別の場面で正規表現らしきものに出会ってしまいました!
会社で導入しているRPAソフトBizRobo!で。
日付データをyyyy/mm/ddをyyyymmddに変換したい、どうやるんだ、とネットを検索していたら、こんなものが出てきた
高度な抽出
パターン .*(\d{4}).*(\d{2}).*(\d{2})
エクスプレッションを出力 $1+”年”+$2+”月”+$3+”日”
現在の日付を2021年4月30日のように変換するという記事。
呪文のようなものが書いてある。なにやら正規表現っぽい。
よくみると「正規表現を使用した日付処理」と書いてあった。
正規表現なんて使わないからいいやい、と思ってスルーしようとしていたけれども、どうやら理解するように努めてみなければならないらしいと覚悟を決めた。
で、いろいろネットを検索して、ちょっと勉強してみました。
どうやら連なる記号はメタ文字というらしい。それぞれにこの文字はこうゆうことをあらわすよという意味があるらしい。(詳しくは記事の末尾の参考とさせていただいたリンクを見るとそれぞれの意味がわかりやすく書いてあります。)
で、これを読み解いてみると
パターン .*(\d{4}).*(\d{2}).*(\d{2})
.* → 「.(ピリオド)」数字でも文字でもなんでもいい。「*」直前の文字の何文字でもいい繰り返し。0文字でもいい(つまりなんにもなくてもOK)。「.(ピリオド)」と「*」の組み合わせは「なんでもいい文字の何文字でもいい繰り返し(なくてもいい)」つまり、VBAなどでいうワイルドカードみたいなもの
\d → 数字。0,1,2,3,4,5,6,7,8,9 のいずれか。[0-9]と同義。
{4} → 直前の文字を{}内の数字分繰り返し。\d{4}は数字4つということ。
で、上記のパターンは
なんでもいい 数字4文字 なんでもいい 数字2文字 なんでもいい 数字2文字
ということか。
だから
20210430
2021/04/30
2021年04月30日
ほにゃらら2021.04.30
は、上記の条件にあてはまる
2021/4/30 は、数字4文字、数字1文字、数字2文字なので数字1文字の部分がだめなので当てはまらない。
R3.04.30 は、最初が数字4文字でないので当てはまらない。
丸かっこは?
とりだす、ということらしい。
.*(\d{4}).*(\d{2}).*(\d{2})
()でかこまれた赤い部分が取り出される
1つ目の() → 2021
2つ目の() → 04
3つ目の() → 30
で一つ目の取り出したものが$1、二つ目の取り出したものが$2、三つ目の・・・取り出した順番に「$n」と書くらしい。
とすると!
$1+”年”+$2+”月”+$3+”日”
は
2021年04月30日
ということか!
ふ~~~ん。なるほど。
がんばれば呪文が読める。
正規表現はいったい何に使うんだろう?
・パターンに一致する文字列の検索
・パターンに一致する文字列の検索と置換
等に使うらしい。
たとえば、入力フォームで郵便番号を入力してほしいとき、
入力した文字列が /^\d{3}-?\d{4}$ とパターンが一致しているか確認し、一致してなければエラーを返す、など。
テキストの中から郵便番号のパターンに一致するものを検索して、1234567や123-4567などバラバラな表記を 〒123-4567 にパターンを置換してきれいにする、とか。
以下の記事にて勉強させていただきました。ありがとうございました。
【JavaScript入門】4つのパターンで理解する正規表現の使い方まとめ! | 侍エンジニアブログ (sejuku.net)
初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」 – Qiita
正規表現で日付のYYYYMMDDをYYYY/MM/DDに手軽に変換 – engineer-kiyoの日記 (hatenablog.com)
正規表現については、本で勉強しようとすると寝落ちする確率が高いように思います。正規表現についてはネットで勉強する方がおすすめかも、です。
以上、ありがとうございました。
コメント