UiPath開発者向け正規表現習得のすすめ

#はじめに
　このドキュメントは、「正規表現を知っておくとUiPathを使う上でかなり便利になりますよ」、というお話です。正規表現に対応したUiPathの機能の紹介を中心に記述しています。なお正規表現自身の記述方法やパターンのルールの話は割愛しています。正規表現の内容について深く知りたい方はインターネット上に既に多くのドキュメントがありますので、そちらを参照ください。

#１．正規表現とは？

>正規表現とは、文字列の集合を一つの文字列で表現する方法の一つである。

(Wikipediaより)

というわけで、これを使うことにより、複雑な条件での文字列の抽出や置換などが実現できます。
　例の一つとしては、例えばStringクラスのReplaceメソッドは特定の文字列しか置換対象として指定できませんが、正規表現置換では例えば３文字以上５文字以下の数字、メールアドレスのルールに合致する文字列等多種多様な条件を指定して置換することができます。

#２．高度な文字列操作ができる
まずは正規表現の最もポピュラーな利用法である文字列操作についてです。
##２－１．文字列操作アクティビティ
　アクティビティパネルの[プログラミング]－[文字列]以下の階層に、__一致する文字列を取得__(Matches)アクティビティ、__文字列の一致をチェック__(IsMatch)アクティビティ、__置換__(Replace)アクティビティの３つの正規表現での文字列操作を行うことができるアクティビティがあります。
![img0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/1a391e11-2de1-5f78-5bb0-bd46dc5189f0.png)
　ぱっと見、正規表現かどうかわからない名称ですが、これらは単純な文字列操作ではなく、正規表現を使った機能となっています。そのため例えばアスタリスク(*)の意味も正規表現に準じたものになりますので、ワイルドカードのつもりで利用すると意図した結果と異なるものになります。

　利用用途は名称の通りで、概ね以下の通りです。
・正規表現の条件に合致する特定の文字列の抽出
→例えば、電話番号の抽出、通貨記号とその後ろに続く数字の抽出、特定文字列の後ろの文字列を取得等々

・正規表現の条件に合致する文字列の有無チェック
→上記例の有無をチェック

・正規表現の条件に合致する文字列の置換
→例えば、1行目を空文字列に置換＝１行目削除、3行以上続く空行を削除、条件付き文字列置換、複数ブロックからなる文字列の順番の入れ替え等々

できることを挙げれば切りがないほど多様なことができます

　これらのアクティビティでは正規表現パターンの作成の際に利用できる正規表現ビルダーも利用できます。正規表現ビルダーには簡単な正規表現パターンを選択形式で作成できる機能のほかに、メールアドレスやURLといったものにマッチするパターンがあらかじめ用意されているため、正規表現初心者以外でも重宝する機能です。
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/3fe1736f-b477-9714-aa76-4d5889feeab0.png)
　正規表現を使い始めて日が浅い方は、この機能や、インターネット上の正規表現テストサイトを利用すると良いでしょう。（なお、正規表現はプログラム言語により、若干仕様が異なりますので、正規表現テストサイトを利用する場合は、.Net Frameworkでの仕様に対応したものがベターです。）

##２－２．System.Text.RegularExpressions.Regexクラス
　.Net FrameworkにあるSystem.Text.RegularExpressions.Regexクラスを使うと、アクティビティよりもいくつかの高度なことが実現できます。
　なおMatchesメソッド、IsMatchメソッド、Replaceメソッドはそれぞれ上記アクティビティとほぼ同じ、Matchメソッドは単一のMatch型変数を返すだけなので説明割愛します。

###正規表現で文字列を分割する(Splitメソッド)
　Regex.Splitメソッドは、文字列を分割するためのセパレーターについて正規表現で指定できるものです。単純な文字や文字列等で分割が難しいケースに役立ちます。またパターン次第では、分割にもちいたセパレーターも分割結果に含めることができるのも、StringクラスのSpitとは異なる点です。

###正規表現でマッチした内容を、任意の処理した結果に置換（MatchEvaluator)
　.Net FrameworkのRegex.ReplaceメソッドにはMatchEvaluatorを引数にもつオーバーロードがあります。UiPathでも匿名関数を使えば、MatchEvaluatorが使え、表題のことが実現できます。

　例えば以下のCSVファイルにName列を追加したいとします。

```sample.csv
ID,Value
1,200
2,30
3,10
```

　IDをKey、NameをValueにしたDictionary 

    dict = new Dictionary(Of String,String)From{{"1","東京"},{"2","大阪"},{"3","福岡"}}

があるとします。

　正攻法としてはCSVファイルをDataTableとして読みこみ、Name列を追加しますが、これを文字列操作で実現してみます。

　ここでsample.csvを読み込んだ文字列変数textに対して

    text = System.Text.RegularExpressions.Regex.Replace(text,"^\d+",function(m) m.Value+","+dict(m.Value),RegexOptions.Multiline)

として、条件にマッチした文字列にdictから得たNameの内容を追記します。
またヘッダ部を置換(text.Replace("ID","ID,Name"))すると

```
ID,Name,Value
1,東京,200
2,大阪,30
3,福岡,10
```
のような結果が得られます。

このようにMatchEvaluatorを使うと、かなり複雑な置換処理を簡潔に記述できるようになります。


#３．正規表現を使ったセレクター
　Enterprise版では2019.10以降で(CEはそれの少し前から)、セレクターに正規表現が使えるようになりました。
　従来は任意の複数文字を指定するアスタリスクと任意文字を指定するクエスチョンマークのみでしたが、正規表現が利用できることにより、かなり複雑かつ細かな条件でも指定できるようになりました。
　指定の方法は属性として ```matching:[対象属性]='regex'```を追加することにより、対象属性が正規表現式として評価されます。

例えば、UiPath Community Forumの左上のロゴのセレクターは下記になりますが、

```
<html title='UiPath Community Forum' />
<webctrl id='site-logo' tag='IMG' />
```

これのid属性に正規表現を適用する場合は、例えば以下のように記述することができます。このパターンはsite-の後ろが英小文字４文字のものであればマッチします。

```
<html title='UiPath Community Forum' />
<webctrl matching:id='regex' id='site-[a-z]{4}' tag='IMG'  />
```

![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/6c71c6a9-1264-03f7-ed2d-2ba97e4c28c8.png)

上記の通り検証も成功します。

　なお正規表現が指定可能な要素はすべてではありませんが、主要なものはサポートされています。詳しくは以下のドキュメント参照ください。

https://docs.uipath.com/studio/docs/regex-search

#４．その他
##Document Understanding におけるRegex Based Extractor
　Intelligent OCR機能の一部として正規表現ベースの抽出子が用意されています。
　Document Understandingを活用したい方は、このような機能も押さえておいたほうが良いでしょう。　

#まとめ
　正規表現はその表現の豊富さ故かなりの奥深さがあり、すべてをマスターするにはそれなりの学習量が必要になりますが、情報処理全般で見ても有用かつ強力な機能です。UiPathでも上記のように多くのシーンで利用可能なので、これを習得することにより処理の幅が大きく広がると思います。興味のある方は是非活用いただければと思います。