Uipathの正規表現取得で、一致する文字列アクティビティを使うな！（暴論）

<h1>はじめに</h1>
Uipath開発者なら一度は通るであろう「正規表現がうまくいかない～」の問題。僕もさんざん頭を悩まされました。
なので、今回は隣の人のパソコンの画面を覗いて「いや～○○君スマ～～～トじゃないねぇ」とドヤ顔できる.NET正規表現について伝授します。なお正規表現の記述方法などについては分かっている前提なのであしからず。

>この記事で学べる事
　●.NETの正規表現の使い方
　●.NETの正規表現で一致した文字列のString型とBool型の保存
　●正規表現アクティビティの裏技
 
 ※この記事はUipath中級者向けです。
<h1>正規表現アクティビティを批判するにあたって</h1>
じゃあ、そもそもUipathアクティビティが何が問題なのかということを指摘すべく、まずはメリットデメリットについて説明します。

:::note info
メリット
　　・.NETのラーニングコストがかからない
　　・正規表現ビルダーが超便利（実装・検証ができる）
　　・アクティビティなので、シーケンス内で何が起こっているのか可視化しやすい
:::
:::note alert
デメリット
　　・正規表現に変数が使えない
　　・（バージョンによっては）変数への保存がString型でできない。
　　・日本語だとアクティビティの名前がコロコロ変わる
　　・Bool型などで一時的に使いたいだけ（条件分岐など）なのに、わざわざ変数に保存が必要。
:::

結局のところ、アクティビティは見た目重視ないしはUipath初心者向けのツールです。.NETの正規表現を理解すると「あれ、アクティビティって無駄な手順踏んでね？」となりますので、安心してください。


<h1>.NETの正規表現の基本</h1>
まずは基本の表現から

```C#:.NET
System.Text.RegularExpressions.Regex.Matches("文字列","検索値");
```
上記は"MatchCollection"というよくわからん型で保存されます。Collectionの通り要素の集合なので、出力などしたい場合はArrayやListのように番号で示す必要があります。
```C#:.NET
mc_Regex = System.Text.RegularExpressions.Regex.Matches("文字列","検索値");
Console.WriteLine(mc_Regex(0).toString);
//検索値 
```
:::note warn
検索値が拾えなかった場合に出力しようとすると、エラーになります。
:::

ここまでで難しいと思ったかもしれませんが、やっていることはアクティビティ"一致する文字列を取得"とほぼ一緒です。上記例では文字列を直接検索させてますが、検索値に正規表現を直接入力すれば正規表現一致箇所の取得が可能です。

そこで賢い皆さんはこう思うでしょう。
　**「あれ、これってStringで取れないの？」**
　**「これでBool型で出せたら、IF文一発じゃん」**

では、次の章から実際にやってみましょう。

<h1>型ごとの正規表現</h1>
今回は取得したい正規表現で用いることが多い2つの型、StringとBoolそれぞれの表記方法を提示します。

前章でお見せした表記`System.Text.RegularExpressions.Regex`は長いので、Importすることを強く推奨します。Importすることで省略して`Regex`が使えます。なお、Importは変数や引数のパネルと同じどころに位置してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036127/8a1a8ecd-804a-adef-f098-8bde57159aec.png)

コードも見やすくなるので、ぜひ活用ください。ちなみにRegexはRegular Expressionの短縮で、意味は正規表現です。　
前置きが長くなりましたが、正規表現のそれぞれの型での使い方をお見せします。

```C#:.NET
//String型
Regex.Match("文字列","検索値").toString;

//Bool型
Regex.IsMatch("文字列","検索値");
```
`Regex`以降が若干変わるだけで、変数型が変わります。ゴイスー！ 
String型がうまくいかなかった人はMatchがMatchesになってないか確認してみてくださいね。

このように「アクティビティを探して使い分ける」よりも、「すべての正規表現はRegexから始まる」と覚えたほうが楽で速いということです。あとはAssignなり、Ifの条件なり自分の好きな場面で使ってください。なお検索値はString型であればなんでも大丈夫なので、変数も使えます。ただし、（特に変数を使うとき）上記は絶対値の完全一致以外は取得できないので、実際にはRegexOptionを入れることがほとんどでしょう。

```C#:.NET
//変数を用いて検索。大文字小文字は無視する。
str_word = "hello"
Console.WriteLine(Regex.Match("HELLO WORLD",str_word,RegexOptions.IgnoreCase).toString);
//HELLO

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036127/b948133f-2da0-0dac-60cc-4f2289a31f80.png)


<h1>アクティビティの裏技</h1>
実は変数を使った正規表現の取得はアクティビティでも可能です。プロパティに直接変数をString型で入力することで、それを検索値として使うことができます。もちろんConcatなどでString同士を接続して複雑な検索値にすることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036127/c41fbdaf-750e-1087-d1b8-fe7a0b172cc1.png)　

しかし、本来のアクティビティのメリットであった「.NETのラーニングコストがかからない」、「正規表現ビルダーが超便利（実装・検証ができる）」の２つが同時に失われるので、それなら最初から.NETでやった方が圧倒的に楽ですし、アクティビティの置きなおしがない分、突発的な仕様変更にも対応しやすいです。<br><br>
で・す・が、正規表現ビルダーが便利なのはゆるぎない事実なので、仮置きで正規表現作成・検証は慣れてないうちは全然ありです。なんなら僕もよく使ってます。

RPAは最終的に動きゃいいんだよ動きゃ。（最大の暴論）

<br>
<h2>おまけ</h2>
今回の記事は公式フォーラム（英語）からの情報を自分なりの解釈でまとめたものです。
正規表現の使い方について、いろんな実例があるのでこちらも参考ください。

https://forum.uipath.com/t/cheatsheet-system-text-regularexpressions-regex/354895