【UiPath】正規表現ビルダーの使い方と「一致する文字列を取得(Matches)」を使用した文字列の抽出方法

## はじめに
この記事の執筆は以下の環境で行っています。
UiPathStudio 2021.6.0-beta.4514 (Community License)
UiPath.System.Activities 21.6.1 Preview
言語：日本語

### この記事は
この記事は「UiPathFriends」が企画する「UiPathブログ発信チャレンジ2021サマー」の17日目の記事になります。
私の初投稿は昨年の同イベントでした。今年はこの投稿をバネにアウトプットを増やしていきたいと思います。

企画の詳細は [コチラ](https://note.com/shumpei_w/n/n651cbdbec4e8) です。

https://twitter.com/ShumpeiWatanabe/status/1405168150736359427?s=20

## なにをするの？
UiPathに2019.2から実装されている正規表現ビルダーを使用して、文字列の抽出を行い、
正規表現の簡単な扱い方と、ビルダーの使い方をそれぞれを紹介します。

## 正規表現とは
そもそも正規表現とは何なのか。

UiPathで開発を行う中で、**特定の文章から決められた文言の部分のみを抽出する**といった処理が必要になった事はないでしょうか。
あるいは、セレクターを曖昧化したり、特定のパターンを持つ名前のファイルだけを処理したいシーンなどでワイルドカードを使う機会があると思いますが、対象の文字列が複雑になってきて**ワイルドカードだけでは対処しきれない文字列**に遭遇した事はないでしょうか。
そんな時に、**決められた記法に則って**指定することで、**複雑な文字列を抽出**して処理を行えるものが正規表現となります。

正規表現自体はUiPath独自の機能ではなく、様々なプログラミング言語で使用することができます。
UiPathで使用する際は.NETで定義されたものが使われますので、より厳密に知りたい方は[Microsoftの公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expressions)などを参照してください。

## UiPathで正規表現を使うには
UiPathで正規表現を扱うには、対応したアクティビティを使用するのが一番かんたんです。
![アクティビティ配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/1f24319f-58fa-48c6-9d00-ff4ae0d1c4da.png)![ビルダー対応アクティビティ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/7e1be3f3-2eda-4e40-191d-ca959e2a7f19.png)

今回は、上記の中から「一致する文字列を取得(Matches)」を使用して、以下の文章から電話番号の部分だけを抜き取る処理を作ってみたいと思います。
>この文章には携帯番号
>Tel：000-1234-5678
>が含まれています

###正規表現ビルダーの使い方
アクティビティに付いている「正規表現を設定」のボタンをクリックします。
すると「正規表現ビルダー」が立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/26e59268-2d3a-1833-f011-dd31099760e6.png)
このビルダーが非常に便利であり、正規表現の記法に詳しくなくとも、項目を選択していくだけで評価に使う式を作成することができます。

まずは、上部の**テスト用テキスト**の部分に文字列の抽出を行いたい文章を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/bb3f2bda-8038-c16a-beff-d9fc4223d630.png)
次に、抽出の条件を設定していきます。
抽出の条件を考えるには、電話番号がどんな文字の塊になっているかを考える必要があります。
`000-1234-5678`は `数字`と`-(ハイフン)`の組み合わせであることがわかります。
さらに組み合わせの内容を考えると `3桁の数字`、`-`、`4桁の数字`、`-`、`4桁の数字`という5つの要素に分解できます。
この分解した内容を正規表現ビルダーの中で表現していきます。

左側のプルダウンでは「何で構成されている」かを選択します。
右側のプルダウンでは「どういう状態」かを選択します。

今回は`3桁の数字`を表現するために左側は**数字**を選択し、右側は**指定回数**を選択して「3」と入力します。
入力が完了すると、テスト用テキストの部分で**今現在、設定した内容**で一致する部分の文字列がハイライトされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/dd0f102e-907e-e6f7-175a-8442299db2fa.png)
正規表現ビルダー上での条件の指定は、右側の「＋」ボタンを押すことで複数設定することができます。
上記の要領で、のこり4つの要素を設定すると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/ffbc2a7a-c4b8-51ba-bde1-8a3e8ed9bcc9.png)
電話番号全体がハイライトされているのが分かります。
また、下部の**完全式**の部分に正規表現のパターン式が自動的に組み上げられました。
「保存」ボタンをクリックすることで、プロパティの「パターン」に組み上げられた式が入力されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/d9efbdd5-5676-b7b4-1d5a-6bb7ddde6373.png)

それでは、残りの部分を設定して、本当に電話番号の部分が抽出できるか確かめてみましょう。
入力ダイアログで文章を入力し、一致した部分をメッセージボックスで表示してみます。
動作させるワークフローと使用する変数は下記の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/c5b5f2f7-ce00-b749-f08e-653a753c6c68.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/61741561-72a4-ebe9-b545-16084d0b9194.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/ffddf8e8-ca2d-810d-9b06-8133ba4d5d89.png)

実行してみると、確かにメッセージボックスに携帯番号の部分だけが抽出されているのが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/885707cd-b34b-db6c-e562-0eca062c59ec.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/391a629f-44fc-5dc0-46cc-5f4a06df7937.png)

### 「一致する文字列を取得(Matches)」を使う際の注意
さて、ここまで読んで「一致する文字列を取得(Matches)」の**結果**に設定した変数を見て顔をしかめた方、いらっしゃらないでしょうか。
私は初めて使った時に顔をしかめました。

実は「一致する文字列を取得(Matches)」というアクティビティは英語名が複数形である通り、条件に一致した文字列が複数ある場合、**そのすべて**を取得します。
入力を以下の文章に変えて実行してみます。

>この文章には携帯番号が2つ含まれています
Tel：000-1234-5678
Tel：111-1234-5678
さて、結果はどうなるでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/5c33fb79-47ee-db22-8047-5385cc68e64f.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/d5d47c2a-1b5e-4cc5-a2ad-903fcfa4e5e8.png)
右側がローカルパネルで表示した取得後の様子です。
指定した条件に一致している番号の部分が2つ格納されていることがわかります。

このように、入力の文章によっては取得結果が複数になることを踏まえて使うことが必要になります。
`IEnumerable<Match>`はそのまま「繰り返し (コレクションの各要素)(For Each)」の入力に使用することができる(取り出した値の型は`System.Text.RegularExpressions.Match`となる)ので、後続で使用する際には何らかの判定ロジックを組み込むと良いと思います。

繰り返しアクティビティを使用して「一致する文字列を取得(Matches)」の取得結果を扱う方法についてはUiPathFriendsメンバーのごじゃむーさんが「[UiPath 正規表現ビルダーを使って情報を抽出する方法](https://qiita.com/odm_knpr0122/items/357ecc3f9c0171b3547a)」という記事でまとめてくれています。

### その他の要素
[「UiPath開発者向け正規表現習得のすすめ」](https://qiita.com/SuetakeYoichi/items/d0f4db91b6fd76478cd3
)という素敵な記事をUiPath Japan MVPの末武さんが書かれています。
本記事では触れられなかった「セレクター内で正規表現を使う方法」なども紹介されていますので、UiPathで正規表現をもっと使いこなしたいと思った方はぜひ読んでみてください。


## さいごに
**正規表現**はUiPathを使って開発を行う中で、ぶつかる壁シリーズの中でもかなり大きな物だと思います。
しかし、正規表現ビルダーの登場でかなり扱いやすくなっていますので、今まで正規表現を敬遠していた方も、ぜひチャレンジしてみてください。
正規表現ビルダーについての詳細は[公式のドキュメント](https://docs.uipath.com/activities/lang-ja/docs/regex-builder-wizard)にも載っています。

この記事を通して、少しでも多くの方の正規表現を使用するハードルを下げられたならば、幸いです。