【Power Apps】正規表現活用テクニックn選

Power Appsで正規表現を利用できる関数に、IsMatch関数、Match関数、MatchAll関数の3種類があります。

https://powerplatformnikki.com/match

これらの関数を活用するテクニックを紹介します。随時更新予定です。

## 正規表現とは

正規表現は、文字列の検索、置換、抽出を行うためのパターンマッチングの言語です。

正規表現は複雑な文字列操作をシンプルに表現することができるため、データ検証や抽出などのタスクで広く利用されています。

ChatGPTに以下のようなプロンプトを投げれば望みの数式を手に入れられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/7aee8d91-4430-769a-b357-d29d14fc2cbb.png)
※たまに嘘をつくので、検証を忘れずに！

## 電話番号の入力チェック

以下の数式で電話番号のバリデーションチェックを行うことができます。

TextInput1に入力したテキストをチェックします。

### ハイフンなし

```
If(
    !IsMatch(TextInput1.Text, "^(0{1}\d{9,10})$"),
    "正しい形式で電話番号を入力してください。"
)
```

先頭が0で9文字または10文字のシンプルな正規表現です。

### ハイフンあり

```
If(
    !IsMatch(TextInput1.Text, "^(\d{2,4})-(\d{2,4})-(\d{2,4})$"),
    "正しい形式で電話番号を入力してください。"
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/997c07e2-b576-bb7f-975e-6aeb276089f8.png)

条件は市外局番: 2~4桁 市内局番: 2~4桁 加入者番号: 2~4桁です。好みに応じて変えてください。

## 月初と月末の日付を取得する

月初はDate(Year(Today()), Month(Today()), 1)、月末はDate(Year(Today()), Month(Today()) + 1, 0)で取得できますが、月初〜月末のような形式で表示したいときにはこちらの方がスマートです。

```
With(
    Match(Text(Today(), "yyyy/mm/dd"), "(?<year>\d{4})/(?<month>\d{2})/(?<day>\d{2})"),
    Date(Value(year), Value(month), 1) & "~" & Date(Value(year), Value(month) + 1, 0)
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/63d2871f-0b8f-c85b-bde9-102d582b73c4.png)

## 特定の拡張子のみ添付できるようにする

編集フォームの添付ファイルカードへのバリデーションチェック機能の実装を想定しています。

Requiredプロパティに!IsBlank(ErrorsMessage.Text)を入れておくとエラーで保存できなくなります。

### 単一の拡張子のみ

以下の画像のように、pngファイルのみ添付を許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/800a4898-b259-9347-6c36-34df8169eeac.png)

添付ファイルカード内のErrorMessageコントロールのTextプロパティに以下の数式を入力します。

```
If(
    !IsBlank(Parent.Error),
    Parent.Error,
    !IsEmpty(Filter(
        DataCardValue8.Attachments,
        !IsMatch(Name, ".*\.png$")
    )),
    "pngファイルを添付してください。"
)
```

### 複数の拡張子を許可する

(拡張子1|拡張子2|...)と|で許可する拡張子を繋げていきます。

```
If(
    !IsBlank(Parent.Error),
    Parent.Error,
    !IsEmpty(Filter(
        DataCardValue8.Attachments,
        !IsMatch(Name, ".*\.(png|jpeg)$")
    )),
    "pngファイルを添付してください。"
)
```

### 特定の拡張子を許可しない

逆に特定の拡張子を許可しない数式は以下の通りです。

```
If(
    !IsBlank(Parent.Error),
    Parent.Error,
    !IsEmpty(Filter(
        DataCardValue8.Attachments,
        IsMatch(Name, ".*\.png$")
    )),
    "pngファイルを添付しないでください。"
)
```

複数の拡張子も同様の記述で実装可能です。

## 文字列から数値部分のみ抜き出す

文字列から数値部分のみ抜き出すことも可能です。

**正規表現(?<取り出す時の名前>正規表現)正規表現**で文字列の特定の部分の値を、**Match関数などの出力として**取り出せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/defab4d2-0402-96ac-de4d-41599f4f47cb.png)

https://powerplatformnikki.com/charactersextraction/

https://powerplatformnikki.com/checknumberofcontrol/

## 文字列の出現回数をカウントする

CountRowsとMatchAllで文字列の出現回数を調べられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/d2cc5966-7958-bc6e-53a5-09c1a59cd94d.png)

https://powerplatformnikki.com/checknumberofcontrol/

## リッチテキストエディタに入力した画像・テキストをそのままTeamsに投稿する

リッチテキストエディタに画像を貼り付けることができますが、これをそのままTeamsに投稿してもうまく画像が表示できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/61fe5e63-bbc2-2d5b-0342-44e10158b933.png)

リッチテキストエディタの出力に含まれる情報をMatchAll関数で抜き出して、これを可能にする方法を以下の記事で解説しています。

https://powerplatformnikki.com/postteamswithimage/

## 【番外編】言論統制への対応

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/5cdb9867-0162-75fb-9438-fd09ec7866e2.png)

言論統制でカタカナを塗りつぶす必要がある方は以下の手順で塗りつぶすことができます。

### コレクションに置換したい文字列を格納する

ForAll関数で繰り返し処理を行う際、Set関数は使用できないためコレクションに対して繰り返し処理を行います。

[]で置換したい文字列を単一列テーブルに変換できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/01b0cf3f-3e77-2e96-0cc9-2daea5034f0b.png)

### カタカナを置換する

以下のコードでカタカナを置換します。

MatchAll関数でカタカナの出現箇所を特定し

、ForAll関数で出現箇所ごとに置換処理を行います。

```
ForAll(
    MatchAll(
        First(ColText).Value,
        "[ァ-ヶー]+"
    ),    
    UpdateIf(
        ColText,
        true,
        {Value:Substitute(First(ColText).Value, FullMatch, Concat(AddColumns(Sequence(Len(FullMatch)), "■", "■"),'■')}
    )
)
```

ちなみにConcat, AddColumns, Sequence, Lenの4関数を使用することで指定した文字数分同じ文字を出力できます。

### 置換後の文字列を表示する

置換後の文字列はコレクションなので、First関数でテキストにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/af9b8007-337f-0ee1-594b-8a059473f576.png)

半分ネタですが、特定の正規表現にマッチする文字列を一度に置換することができるのでぜひ活用してください。

## 元記事

https://powerplatformnikki.com/powerappsregexmatch/