Robotic Crowd

Robotic Crowd

正規表現

Author: Ren Murayama 277 views

この記事では正規表現を触ったことがない方に向けて、正規表現の使い方を説明します。

 正規表現とは

正規表現とは、個別の文字列を「数字が3桁」「”田中”に続く2文字」「数字と英数字の組み合わせ」といった粒度に抽象化した表現形式のことです。

Webページに載っている郵便番号など、規則性のある文字列を具体的な文字列が分からない状態で探すときに役立ちます。
Robotic Crowdのアクションでは、ReplaceText, MatchTextなどで使用します。

例えば、ある作業中にテキストから郵便番号を探しているとします。
(郵便番号はハイフンで区切られているものとします)
この時、「000-0000」から「999-9999」の1,000万通りの数字の組み合わせ表を用意して、それぞれの組み合わせを1,000万回検索するような探し方はしないと思いますし、ロボットの設定においても現実的ではありません。

実際に目で見て確認するとしたら、「郵便番号といえば『数字3桁、ハイフン、数字4桁』の組み合わせだな」と考え、「103-0014」は郵便番号っぽいぞ、と目が留まるという流れになると思います。

※画像の例だと〒マークの後に続く文字を探す手もありますが、その場合はどこまでが郵便番号か?を合わせて示す必要があります。

この時頭の中で作った「数字3桁、ハイフン、数字4桁」という、抽象化された文字パターンが正規表現の考え方です。

 正規表現の記法

ここまで、正規表現が抽象化された文字パターンだということを説明しました。
ただし、「数字3桁、ハイフン、数字4桁」というのはあくまで私が頭の中で思い浮かべているパターンです。
人によっては「3ヨコ4」と唱えながら郵便番号を探しているかもしれませんし、日本語以外でももちろん表現が可能です。

ここからは、この文字パターンを誰もが間違わずに認識できる表現に落とし込んでいくことを考えます。

上記の例で考えると、「数字3桁、ハイフン、数字4桁」の表現に英数字やかな文字をそのまま使用するとまずそうな感じがします。
例えば「0*3-0*4」という表現は、0が特定の数字である”0”を表すのか、数字全般を表すのかがはっきりしません。

これは他のどんな文字・記号を使った時でも同じことが言えます。
すなわち、正規表現では一般化した文字(数字全般など)を表す文字の組み合わせを決めておく必要があるということです。
これは「メタ文字(特殊文字)」と呼ばれています。

メタ文字は個別の文字の一般化だけではなく、「~が2回連続している」「~の後に続く…」なども表すことができます。
具体的なメタ文字は以下のリンク先からご確認ください。(外部サイトに飛びます)

分類探し方の例リンク
文字クラス任意の数字、任意の文字列文字クラス – JavaScript | MDN
言明文頭のxxx, oooに続くxxx言明 – JavaScript | MDN
グループと範囲xxxまたはoooのいずれか, 0-9の数字のみの組み合わせグループと範囲 – JavaScript | MDN
数量詞xが1回以上連続, oが4回繰り返し数量詞 – JavaScript | MDN

これを使うと、「数字3桁、ハイフン、数字4桁」は\d{3}-\d{4}と表すことができます。(-は文字としてそのまま使えます)
※「[0-9]{3}-[0-9]{4}」などでも可。これは「0~9の3文字、ハイフン、0~9の4文字の組み合わせ…」と唱えながら「XXX-XXXX」を探すこともできると言っているのに等しいです。

正規表現のメタ文字や作成パターンはつど調べながら書くことが多く、一気に覚える必要はありません。

 よく使うパターン

以下でよく使われる正規表現を紹介します。
解説が必要なものや複雑なものについては、一般のサイト含めリンクを掲載する形にしています。

検証については、以下などの外部ツールを使うと便利です。
https://www-creators.com/tool/regex-checker

※ReplaceTextアクションを使う場合は、以下で取得した文字列が置換対象になります。
※想定する文字列のパターンによっては、拾いきれないものがある可能性があります。

(例)Robotic CrowdのCrowdにマッチする。

(?<=Robotic\s).+

スペースを\sの特殊文字に起こす必要がある点に注意してください。
(?<=文字列1)文字列2文字列1に続く文字列2

(例)Robotic CrowdのRoboticにマッチする

.+(?=\sCrowd)

スペースを\sの特殊文字に起こす必要がある点に注意してください。
文字列1(?=文字列2) .. 文字列2のすぐ手前の文字列1

(例)以下からメールアドレスを取得する

申し込み情報
名前:田中太郎
メールアドレス:xxxx@test.com
住所:xxxx県oooo市

(?<=メールアドレス:).+(?=\n)

改行は基本的に\nもしくは\rの特殊文字です。
実際のメールをGmailGetアクションなどで取得すると、innerTextにてメタ文字が確認できます。

例)Robotic CrowdのGetFileで取れる以下のような文字列からファイル名を取得

[^/]+$

文末から”/”を含まないところまでの文字列を取得するという考え方です。
[^/] … /以外の任意の文字

例)ハイフンで区切られた固定電話(市外局番あり)、携帯電話番号にマッチ
(0120-000-000, 080-0000-0000, 03-0000-0000など)

/^0\d{1,4}-\d{1,4}-\d{3,4}$/

電話番号は01(2345)6789や23456789など出現パターンが多岐に渡ります。
考慮しなくてよいパターンを見極めて使うとよいかと思います。
以下のサイトの説明が詳しいです。

例)dummy-1@test.com , dummy+2@test.co.jpのパターンにマッチ
(@手前の記号、@以後のドットの数にかかわらず、対象文字列にマッチ)

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9][a-zA-Z0-9.]+[a-zA-Z]{2,}

以下のサイトの説明が詳しいです。
メールアドレスの正規表現 | 正規表現入門

例)都道府県を抽出

北海道|東京都|京都府|大阪府|.{2,3}県

市区町村以降の抽出はかなり例外パターンが多く、また政令指定都市に限ってxx市oo区で取得するといった考慮すべき内容が多いです。

以下のページの説明が詳しいです。
なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ – Qiita

正規表現 regexp match text replace text

このページは役に立ちましたか?