Regular Expressionの復習:ワイルドカード
Regular Expression(正規表現)はただの暗号のようにしか見えないけど、必要に迫られたので、急いで復習する。こちらのページ https://regex101.com/ が分かりやすいと評判なので使ってみる。
regular expressions 101
https://regex101.com/ を開くと以下のような画面が出てくる。

上記スクリーンショットで示した1番のREGULAR EXPRESSION、に platypusと入力する。regular expressionは スラッシュ/ /の間で使うが、既に ” / ” が記載されているので、間の部分を入力するだけとなっている。
2番のTEST STRINGにplatypusという文字を含むかどうかを知りたいテキストを入力する。そうすると、4番のMATCH INFORMATIONに1つマッチしたと結果が表示される。
3番は1番のRegular Expressionが表現している検索条件の詳細を表示していて、5番は書き方を調べるためのカンニングペーパー。
/platypus/ は完全一致
1番の右端に緑のフォントでgmとあるが、
これはフラグと呼ばれ、検索する際のオプション設定を示している。
このページではデフォルトでgとmにチェックが入っているが、あくまで正規表現のオプションなので、チェックを外しても動く。また、順番も自由なので、gmでもmgでも両方適用される。
どういう時に使うかというと、大文字と小文字を区別するかどうかや、最初にマッチしたところで検索を止めるか、条件に合うものは全て見つけ出すかなどを指定するために使われる。
例えば先ほどの /platypus/gmでは、もし検索対象が大文字で始まるPlatypusだった場合、Matchしないがinsensitiveにチェックを入れて、フラグをgmiとすればマッチする。

ワイルドカード(Wildcard)
次にワイルドカードについて見ていく。
.
(ドット): 任意の一文字
. (ドット)は任意の1文字を表す。
大文字と小文字を区別しない i のフラグをつけて、/p../gmiと検索すると、Plaとpusが2つマッチした。

そして、ここで衝撃の事実を知った。
私はこれまで *
(アスタリスク)もワイルドカードだと思っていた。
しかし正規表見では少し意味が異なる使われ方をしていることを今更知った。
.
(ドット): 任意の一文字*
(アスタリスク): 0回以上の繰り返し+
(プラス): 1回以上の繰り返し?
(クエスチョン): 0回または1回の繰り返し
+や?も合わせて見てみると、.
(ドット)は文字を置き換えているが、他3つは1つ前の文字が繰り返されているかどうかを確認しているだけなので、例えば”Pl*typus”と書いたら、”Platypus”がMatchするかと思いきや、マッチせず! 代わりにLを除いた”ptypus”はマッチする仕様。そうだったのか。

えーと、では/P.*/ だと Pで始まり任意の文字が続くかもしれないし、続かないかもしれない、という意味になるから、Pで始まる言葉を見つけてくれるのかな?試してみよう。
違った・・・。
最初に見つけたP以降、最後まで丸ごと取ってきてしまった。
*(アスタリスク)は改行するまで突き進んでしまうタイプらしい。

では、Pで始まる単語を抽出するにはどうしたらいいのか。
/\bP\w*\b/ig を解読する
分からないので、chatGPTにPで始まる文字を検索するための正規表現を聞いて、答えを見ながら何をやっているのか理解してみることにした。\bP\w*\b という答えが返ってきた。
・ \b 単語の区切れ目を示す。(注意:日本語は単語の間にスペースがないので反応しない)
・ \w 単語の文字を示す。(注意:こちらも日本語非対応)
こういう感じでエスケープ(\)と合わせて書くと特殊な意味を持つ文字は他にもいくつかある(5番のカンペ参照)。

つまり、/\bP\w*\b/igは「単語の区切れ目で始まって、P or pがそれに続き、単語となる文字がいくつか続くかもしれないし、続かないかもしれないけど、とにかくその後また単語の区切れ目で終わるもの。それを与えた文字列の中から、一つ見つかっても終わらせないで最後まで探し出す」という意味になるということを理解できた。
Pで始まる単語がマッチできるようになったところで本日は以上!
/\(*´▽`*\) /
↑この顔文字風正規表現は
こちらの顔文字にマッチする↓
(´▽`)
Have a nice day!