Power AppsでMatch関数 きほんのき

# 文字列の検証
ユーザーの入力を評価するうえで、活躍する`Power Apps`の関数は
- [IsMatch 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch)
- [Match 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch#match-and-matchall-examples)
- [MatchAll 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch#match-and-matchall-examples)

上記が挙げられます。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch

文字列の入力、となるとユーザーの入力内容は千差万別であり、ある程度`テキスト 入力`コントロールで、制約をかけられても、より強固な制約をかけるためには関数の工夫が必要です。

これらの関数の活用においては
 - **通常文字**
 - **事前定義済みパターン**
 - 正規表現

という三つの活用オプションがあります。
`正規表現`となると、やや難解な印象を受けますので、`通常文字`と`事前定義済みパターン`に焦点を当てて、活用方法を見ていきましょう。

# 通常文字
通常文字は、言葉のとおり「単語に一致しているか・していないか」を判断します。
活用例は[IsMatch 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch)が妥当だと思いますので、こちらを例に書いていきます。

`Gatsuo`という文字に対し`Gatsuo`という文字がマッチしているか、このような観点では`完全一致`という観点で[IsMatch 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch)の検証がされます。

完全一致以外にも[MatchOptions](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch#match-options)を指定することで、`完全一致`以外のパターンも見ていくことができます。

## 例
このようなアプリを用意してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ef9f5f09-7159-75d0-3106-d158a1a922e0.png)

赤枠`rgba(255,0,0,1)`で検証をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/64174530-16c2-3a4e-e43d-9987c657ef55.png)

```plaintext:検証する文字列
// 先頭の文字がGatsuo
GatsuoのロードShow

// 末尾の文字がGatsuo
ShowのGatsuo

// 完全一致
Gatsuo

// 大文字小文字が異なるGatsuo
gAtsUo

// 半角スペースが入ったGatsuo
 gats uo

// 複数行テキストのGatsuo

Gatsuo

// 複数行に文字がまたがるGatsuo

Ga
tsu
o
```

### 1. 先頭文字の一致
まず[IsMatch 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-ismatch)の書き方からご紹介します。

```yaml:Text
IsMatch({検証する文字},{一致する文字},{オプション})
```

検証に使っている関数は下記のとおりです。

```yaml:trueのケース
IsMatch(inpBeginsWithTrue.Value,"Gatsuo",MatchOptions.BeginsWith)
```

```yaml:falseのケース
IsMatch(inpBeginsWithFalse.Value,"Gatsuo",MatchOptions.BeginsWith)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/84586f26-2a1a-16be-c2ad-1e328bdcdc00.png)

`GatsuoのロードShow`は先頭が一致しているため`true`を返し、`ShowのGatsuo`は異なるので`false`を返しています。

### 2. 完全一致
`MatchOptions`を省略すると、自動的に`MatchOptions.Complete`と解釈されます。

```yaml:trueのケース
IsMatch(inpCompleteTrue.Value,"Gatsuo")
```

```yaml:falseのケース
IsMatch(inpCompleteFalse.Value,"Gatsuo")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e1f26d77-fbeb-07db-446d-81982caf9108.png)

見てのとおり、`完全一致`のみ`true`を返します。

### 3. 部分一致、文字列に含まれているか
文字列の中に`Gatsuo`が含まれていればOKという場合、`MatchOptions.Contains`を使います。
先頭、末尾によくわからない文字やスペースが入っていても許容されるケースです。

```yaml:trueのケース
IsMatch(inpContainsTrue.Value,"Gatsuo",MatchOptions.Contains)
```

```yaml:falseのケース
IsMatch(inpContainsFalse.Value,"Gatsuo",MatchOptions.Contains)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/479c495b-7e17-88ea-abd4-4b95c7e7aeae.png)

`部分一致`というやつですね。使いどころがありますね。

### 4. 末尾の文字の一致
文字列の末尾にパターンが一致しているか、チェックする方式です。

```yaml:trueのケース
IsMatch(inpEndsWithTrue.Value,"Gatsuo",MatchOptions.EndsWith)
```

```yaml:falseのケース
IsMatch(inpEndsWithFalse.Value,"Gatsuo",MatchOptions.EndsWith)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/aad9a95f-a7b8-0cb0-441a-bbb5bfff7ec0.png)

### 5. 大文字小文字を無視
文字列が大文字であるか、小文字であるか、かかわらずMatchさせる場合は、`MatchOptions.IgnoreCase`を使います。

```yaml:trueのケース
IsMatch(inpIgnoreCaseTrue.Value,"Gatsuo",MatchOptions.IgnoreCase)
```

```yaml:falseのケース
IsMatch(inpIgnoreCaseFalse.Value,"Gatsuo",MatchOptions.IgnoreCase)
```

### 6. 複数行テキスト
改行文字が含まれている場合でもマッチしているものを検出する際に`MatchOptions.Multiline`を使います。
文字列の中に、改行が含まれても良いということではないのでご注意ください！

```yaml:trueのケース
IsMatch(inpMultilineTrue.Value,"Gatsuo",MatchOptions.Multiline)
```

```yaml:falseのケース
IsMatch(inpMultilineFalse.Value,"Gatsuo",MatchOptions.Multiline)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b28cf883-db95-3310-f46b-cf5744dc72c3.png)

# ここから本番・・・と言いたいところですが！！
ここから自分の推しである`事前定義済みパターン`の紹介に移りたいところですが、冗長になるため、ここで一旦ブログを区切ります！

続きは次回をお楽しみに！