【第97回】ロータス博士のWinActor塾~正規表現Ⅱ

それでは前回に引き続いて正規表現をやっていこう。

覚えちゃえば簡単!ってやつですね!

いや、今回は一覧でばっと出すから全部覚えるのは難しいかもしれん。
じゃがいつも言っているように、そんなものがあるという認識さえあれば
あとは辞書を引く要領で使えるはずじゃ。

そうですね。

え、不満そう・・・。
正規表現に使える要素
前回、正規表現を使う際に記号をところどころに記述したのを覚えているでしょうか。
正規表現には記号ひとつひとつに意味があり、その組み合わせで表現しているのです。
今回はそれらの記号がどのような意味を持つのかを一覧で解説します。
この一覧以外にも正規表現にはたくさんの種類がありますが、よく使う代表的なものに絞り込んでご紹介します。
文字クラス
一文字を指定する表現です。
要素 | マッチ箇所 | 例 |
. | \n以外の任意の一文字 | .ab = 2文字がa 3文字目がbである任意の3文字にマッチ |
[A] | 文字クラス内の任意の一文字 | [abcde] = a,b,c,d,e のいずれかの文字にマッチ |
[^A] | 文字クラス内の任意の一文字以外 | [^abc] = a,b,c 以外の文字にマッチ |
[A-B] | 文字クラスの範囲内の一文字 | [a-e] = aからeまでの文字にマッチ |
[^A-B] | 文字クラスの範囲外の一文字 | [^a-e] = aからeまでの文字以外にマッチ |
\w | 単語に使用される文字 | \w = a,b,c,1,2,3 などにマッチ(+,-などはマッチしない) |
\W | \w以外の文字 | \W = +,- などにマッチ |
\d | 10進数に使用される文字 | \d = 1,2,3 などにマッチ(a,b,cなどはマッチしない) |
\D | \d以外の文字 | \D = a,b,c,+,- などにマッチ |
\s | 空白を表す文字 | \s = 「 」や「\t」にマッチ |
\S | \s以外の文字 | \S = a,b,c,+,-などにマッチ |
量指定子
文字クラスの連続する数を指定することができます。
要素 | マッチ箇所 | 例 |
* | 0個以上連続する箇所 | a*b = 0個以上連続するaの直後にbがある文字列(b, ab, aabなど)にマッチ |
+ | 1個以上連続する箇所 | a+b = 1個以上連続するaの直後にbがある文字列(ab, aabなど)にマッチ |
? | 0個または1個連続する箇所 | a?b = aの直後にbのある箇所またはbのある箇所にマッチ |
{n} | n個連続する箇所 | a{2}b = aが2個連続した直後にbがある箇所にマッチ |
{n,} | n個以上連続する箇所 | a{2,}b = aが2個以上連続した後にbがある箇所にマッチ |
{n,m} | n個以上m個以下連続する箇所 | a{2,3}b = aが2~3個連続した後にbがある箇所にマッチ |
ゼロ幅アサーション
文字列の位置を指定できます。
要素 | マッチ箇所 | 例 |
^ | 文字列の先頭 | ^abc = abcで始まる箇所にマッチ |
$ | 文字列の末尾 | abc$ = abcで終わる文字列にマッチ |
実例
それでは例として、ある範囲の数字の場合にマッチするものを作ってみましょう。
シナリオは前回と同じものを使用します。
今回は「0~5」の数字があればマッチとみなされるように正規表現を指定してみます。
テスト用シナリオ
まずはシナリオ全体像です。これは前回と同様です。
分岐ノードで正規表現を使用するため、マッチした場合に左側(true)のフローに進みます。
実際に指定する正規表現ですが、0~5の範囲を指定したいので文字クラスの[A-B]を使いましょう。
要素 | マッチ箇所 | 例 |
[A-B] | 文字クラスの範囲内の一文字 | [a-e] = aからeまでの文字にマッチ |
これは文字だけでなく、数字にも使えます。
[a-e] では a,b,c,d,e にマッチしますが、[0-5]とすると 0,1,2,3,4,5 にマッチします。
実際に使ってみましょう。
実行結果
まずは数字ですらない文字を入れてみます。
当然マッチしませんでした。
それでは次は0~5に含まれる数字「1」を入れてみます。
マッチしましたね。
最後に、0~5以外の数字でマッチするかどうかをチェックしましょう。
マッチしませんでした。
これで0~5のときにマッチすることが確認できました。
念のために境界ぎりぎりの0と5もチェックしましょう。
問題なさそうです。
これで0~5の範囲指定ができました。

へえー。こんなにすんなりいくもんなんですね。
上で紹介してもらった表と例があればいけそうです!

記号の羅列でどうしてもプログラミングっぽい印象があるから
食わず嫌いの人も多いようじゃぞ。
チャレンジ精神は大事じゃな!
練習問題
実は先ほどの例には欠陥があります。
[0-5]という表現では、文字列中に「0~5」の文字が存在したらマッチという判定なので
ひとつでも含まれていれば判定としてはtrueに流れます。
では0~5を含んだ文字列で試してみましょう。

百歩譲ってabc5はまだわかるけど
148が0~5っていうのはちょっとオカシイ・・・。
これを0~5の一文字だけにマッチするように直してください。
実行結果が次のようになれば成功です。

最初に紹介した表を見て
どれを組み合わせればよいか考えるのじゃ!

と、いうわけで今回はさらに深堀りしてみたが
どうじゃったかな?

正直あの表見たら具合悪くなりましたけど
覚えなくていいっていうならまぁ・・・

なぜお主はロボットなのに覚えるのが嫌いなんじゃ・・・。

でも任せてください。
この練習問題を華麗に解いてみせますよ!

お、気合入っとるな!
それでは次回の答え合わせをお楽しみに!
関連記事こちらの記事も合わせてどうぞ。
2024.11.05
【第105回】ロータス博士のWinActor塾~新しい画像マッチング画面
2024.09.27
【第104回】ロータス博士のWinActor塾~ガイド利用シナリオ(作成編)
2024.09.10