IsMatch、Match、および MatchAll 関数
適用対象: キャンバス アプリ モデル駆動型アプリ Power Pages Power Platform CLI
一致をテストするか、パターンに基づいてテキスト文字列の一部を抽出します。
内容
IsMatch 関数は、通常文字、事前定義済みのパターン、または正規表現 が含まれたパターンにテキスト文字列が一致するかどうかをテストします。 Match および MatchAll 関数は、サブマッチを含め、一致したものを返します。
IsMatch は、ユーザーがText input コントロールに入力した内容を検証するために使用します。 たとえば、データ ソースに結果が保存される前に、ユーザーが有効な電子メール アドレスを入力したかどうかを確認できます。 エントリが条件に一致しない場合、エントリの修正をユーザーに求める他のコントロールを追加します。
Match を使用してパターンに照合する最初のテキスト文字列を抽出し、MatchAll を使用して一致するすべてのテキスト文字列を抽出します。 複雑な文字列を解析するためにサブマッチを抽出することもできます。
Match は、最初に見つかった一致の情報のレコードを返し、 MatchAll は、見つかったすべての一致のレコードのテーブルを返します。 レコードまたはレコードには次のものが含まれます:
Column | タイプ | 説明設定 |
---|---|---|
名前付きサブマッチまたはサブマッチ | Text | それぞれの名前付きサブマッチには、独自の列があります。 正規表現で (?< 名前 >...) を使用して名前付きサブマッチを作成します。 名前付きサブマッチの名前が事前定義済みの列 (下記) の 1 つと同じである場合、サブマッチが優先され、警告が生成されます。 この警告を回避するには、サブマッチの名前を変更します。 |
フルマッチ | テキスト | 一致したすべてのテキスト文字列。 |
スタートマッチ | 番号 | 入力テキスト文字列内での一致の開始位置。 文字列の最初の文字は 1 を返します。 |
サブマッチ | テキストの単一列テーブル (列 Value) | 正規表現に表示されている順序の、名前付きおよび名前なしのサブマッチのテーブル。 通常、名前付きサブマッチは操作が簡単であり、推奨されています。 個々のサブマッチを使用したForAll 関数またはLast ( FirstN( ... ) ) 関数を使用します。 サブマッチが正規表現で定義されていない場合、このテーブルは存在しますが空になります。 |
これらの関数はMatchOptions をサポートします。 既定:
- これらの関数は、大文字と小文字を区別する一致を実行します。 大文字と小文字を区別しない照合を実行するには MatchOptions.IgnoreCase を使用します。
- IsMatch はテキスト文字列全体に一致します (Complete MatchOption)。一方、 Match と MatchAll はテキスト文字列内の任意の場所に一致するものを検索します (Contains MatchOption)。 シナリオに応じて完了、含む、BeginsWith、または EndsWith を使用します。
IsMatch は、テキスト文字列がパターンと一致する場合は true を返し、一致しない場合は false を返します。 Match は、 IsBlank 関数でテストできる一致が見つからない場合は 空白 を返します。 MatchAll は、 IsEmpty 関数でテストできる一致が見つからない場合に空のテーブルを返します。
MatchAll を使用してテキスト文字列を分割する場合は、使用するのに簡単で迅速なSplit 関数を使用することを考慮します。
パターン
これらの関数を使用する鍵は、一致のパターンを記述することです。 パターンは、以下を組み合わせたテキスト文字列で記述します:
- "abc" や "123" などの通常文字。
- レター、MultipleDigits、電子メール などの事前定義済みのパターン。 (Match 列挙型はこれらのパターンを定義します。)
- "\d+\s+\d+" または "[a-z]+" などの正規表現コード。
これらの要素は、文字列連結演算子 &を使用して組み合わせることができます。 たとえば、"abc" & Digit & "\s+" は有効なパターンであり、後ろに 0 から 9 までの数字と少なくとも 1 つの空白文字が付いた文字 "a"、"b"、"c" に一致します。
通常文字
最も単純なパターンは、正確に一致した通常文字の一連です。
たとえば、IsMatch 関数で使用されるとき、文字列 "Hello" はパターン "Hello" に正確に一致します。 過不足がありません。 文字列、「hello!」は、末尾に感嘆符が付いており、文字「h」の大文字と小文字が間違っているため、パターンに一致しません。 (この動作を変更する方法に関しては、MatchOptions を参照してください。)
パターンの言語では、特定の文字は特別な目的で予約済みです。 これらの文字を使用するには、接頭辞に \ (バックスラッシュ) を付けた文字が文字どおりに解釈されるようにするか、このトピックの後で定義されている定義済みのいずれかのパターンを使用します。 このテーブルは、特殊文字の一覧を示します:
特殊文字 | 説明 |
---|---|
。 | ドットまたはピリオド |
? | 疑問符 |
* | アスタリスク |
+ | 加える |
() | かっこ |
[ ] | 角かっこ |
{ } | 中かっこ |
^ | キャレット |
$ | ドル記号 |
| | 縦棒またはパイプ |
\ | バックスラッシュ |
たとえば、「Hello?」と一致させることができます。パターンを使うことで "Hello\?" 疑問符の前にバックスラッシュを付けます。
事前定義済みパターン
事前定義済みのパターンは、文字セットの 1 つ、または一連の複数の文字を簡単に一致させる方法を提供します。 文字列連結演算子 & を使用して、独自のテキスト文字列と Match 列挙型のメンバーを組み合わせます。
Match 列挙型 | 内容 | 正規表現 |
---|---|---|
どれでも | 任意の文字と一致します。 | . |
コンマ | コンマと一致します。 | , |
桁 | 1 桁の数と一致します ("0"~"9")。 | \d |
メール | "at" 記号 ("@") およびドット (".") が付いたドメイン名が含まれている電子メール アドレスと一致します | .+\@.+\\.[^\\.]{2,} |
ハイフン | ハイフンと一致します。 | \- |
左括弧 | 左かっこ "(" と一致します。 | \( |
手紙 | 文字と一致します。 | \p{L} |
複数桁 | 1 桁以上の数と一致します。 | \d+ |
複数の文字 | 1 つ以上の文字と一致します。 | \p{L}+ |
複数の非スペース | 空白 (スペース、タブまたは改行) を追加しない 1 つ以上の文字と一致します。 | \S+ |
複数のスペース | 空白 (スペース、タブ、または改行) を追加する 1 つ以上の文字と一致します。 | \s+ |
非スペース | 空白を追加しない 1 文字と一致します。 | \S |
オプション数字 | 0、または 1 桁以上の数と一致します。 | \d* |
オプション文字 | 0 または 1 文字以上と一致します。 | \p{L}* |
オプションの非スペース | 空白文字を追加しない 0 または 1 文字以上と一致します。 | \S* |
オプションスペース | 空白文字を追加する 0 または 1 文字以上と一致します。 | \s* |
期間 | ピリオドまたはドット (「.」) と一致します。 | \. |
右括弧 | 右かっこ ")" と一致します。 | \) |
空間 | 空白を追加する 1 文字と一致します。 | \s |
タブ | タブの文字と一致します。 | \t |
たとえば、パターン "A" & MultipleDigits は、後ろに 1 桁以上続く文字「A」と一致します。
正規表現
これらの関数が使用するパターンは正規表現 です。 このトピックの前半に定義された、通常文字および事前定義済みのパターンは、正規表現の構築に役立ちます。
正規表現は非常に強力で、多数のプログラミング言語で使用可能であり、さまざまな目的で使用されています。 また、ランダムな一連の句読点のように見えることもあります。 この記事では、正規表現のすべての点について説明していませんが、役に立つ貴重な情報、チュートリアル、およびツールが Web 上で使用可能です。
正規表現にはさまざまな方言があり、Power Apps では JavaScript の方言のバリアントを使用します。 構文の紹介に関しては、正規表現の構文 を参照します。 名前付きサブマッチ (名前付きキャプチャ グループと呼ばれることもあります) がサポートされています:
- 名前付きサブマッチ: (?<name> ...)
- 名前付き後方参照: \k<name>
このトピックの前半の Match 列挙型テーブルでは、各列挙型は、対応する正規表現と同じ行に表示されます。
Match オプション
これらの関数の動作は、1 つ以上のオプションを指定して変更することができます。これらのオプションは文字列連結演算子 (&) を使用して組み合わせることができます。
MatchOptions 列挙型 | Description | 正規表現への影響 |
---|---|---|
MatchOptions.BeginsWith | パターンはテキストの先頭から一致する必要があります。 | 正規表現の先頭に ^ を追加します。 |
マッチオプション.完了 | IsMatch の既定。 パターンは、先頭から末尾までテキストの文字列全体と一致する必要があります。 | 正規表現の開始位置に ^、末尾に $ を追加します。 |
マッチオプション.Contains | Match および MatchAll の既定。 パターンは、テキストのどこかに表示する必要がありますが、先頭または末尾である必要はありません。 | 正規表現を変更しません。 |
マッチオプション.EndsWith | パターンはテキストの文字列の末尾と一致する必要があります。 | 正規表現の末尾に $ を追加します。 |
マッチオプション.大文字と小文字を区別しない | 大文字と小文字を同じものとして扱います。 既定では、一致は大文字と小文字を区別します。 | 正規表現を変更しません。 このオプションは、正規表現の標準の「i」修飾子と同等です。 |
マッチオプション.複数行 | 複数の行にわたって一致します。 | 正規表現を変更しません。 このオプションは、正規表現の標準の「m」修飾子と同等です。 |
MatchAll を使用することは、正規表現に標準の「g」修飾子を使用することと同じです。
構文
IsMatch( テキスト, パターン [, オプション ] )
- テキスト – 必須。 テストするテキスト文字列。
- パターン – 必須。 テキスト文字列としてテストするパターン。 Match 列挙型が定義する事前定義済みのパターンを連結するか、正規表現を提供します。 パターン は、アプリの実行時に変化する変数、データ ソース、その他の動的参照を含まない定数式である必要があります。
- オプション – オプション。 MatchOptions 列挙値を組み合わせたテキスト文字列。 既定では MatchOptions.Complete が使用されます。
一致( テキスト, パターン [, オプション ])
- テキスト – 必須。 一致するテキスト文字列。
- パターン – 必須。 テキスト文字列として一致するパターン。 Match 列挙型が定義する事前定義済みのパターンを連結するか、正規表現を提供します。 パターン は、アプリの実行時に変化する変数、データ ソース、その他の動的参照を含まない定数式である必要があります。
- オプション – オプション。 MatchOptions 列挙値を組み合わせたテキスト文字列。 既定では、MatchOptions.Complete が使用されます。
すべて一致( テキスト, パターン [, オプション ] )
- テキスト – 必須。 一致するテキスト文字列。
- パターン – 必須。 テキスト文字列として一致するパターン。 Match 列挙型が定義する事前定義済みのパターンを連結するか、正規表現を提供します。 パターン は、アプリの実行時に変化する変数、データ ソース、その他の動的参照を含まない定数式である必要があります。
- オプション – オプション。 MatchOptions 列挙値を組み合わせたテキスト文字列。 既定では、MatchOptions.Complete が使用されます。
IsMatch の例
通常文字
アプリは TextInput1 という名前の Text input コントロールが含まれていると想像します。 ユーザーはデータベースに格納されるために、このコントロールに値を入力します。
ユーザーは TextInput1 に Hello World と入力します。
計算式 | 内容 | 結果 |
---|---|---|
IsMatch( TextInput1.Text, "Hello world" ) |
ユーザーの入力が文字列「Hello World」に正確に一致するかどうかをテストします。 | 真実 |
IsMatch( TextInput1.Text, "Good bye" ) |
ユーザーの入力が文字列「Good bye」に完全に一致するかどうかをテストします。 | 間違い |
IsMatch( TextInput1.Text, "hello", Contains ) |
ユーザーの入力に単語「hello」 (大文字と小文字の区別) が含まれているかどうかをテストします。 | 間違い |
IsMatch( TextInput1.Text, "hello", Contains & IgnoreCase ) |
ユーザーの入力に単語「hello」 (大文字と小文字を区別しない) が含まれているかどうかをテストします。 | 真実 |
事前定義済みパターン
計算式 | 内容 | 結果 |
---|---|---|
IsMatch( "123-45-7890", Digit & Digit & Digit & Hyphen & Digit & Digit & Hyphen & Digit & Digit & Digit & Digit ) |
米国の社会保障番号と一致します | 真実 |
IsMatch( "joan@contoso.com", Email ) |
電子メール アドレスと一致します | 真実 |
IsMatch( "123.456", MultipleDigits & Period & OptionalDigits ) |
一連の数字、ピリオド、0 以上の数字と一致します。 | 真実 |
IsMatch( "123", MultipleDigits & Period & OptionalDigits ) |
一連の数字、ピリオド、0 以上の数字と一致します。 一致するテキストにピリオドが表示されないため、このパターンは一致されません。 | 間違い |
正規表現
計算式 | 内容 | 結果 |
---|---|---|
IsMatch( "986", "\d+" ) |
0 以上の整数と一致します。 | 真実 |
IsMatch( "1.02", "\d+(\.\d\d)?" ) |
正の通貨金額と一致します。 入力に小数点が含まれる場合、入力には小数点の後ろに 2 つの数値が含まれている必要があります。 たとえば、3.00 は有効ですが、3.1 は無効です。 | 真実 |
IsMatch( "-4.95", "(-)?\d+(\.\d\d)?" ) |
正または負の通貨金額と一致します。 入力に小数点が含まれる場合、入力には小数点の後ろに 2 つの数値が含まれている必要があります。 | 真実 |
IsMatch( "111-11-1111", "\d{3}-\d{2}-\d{4}" ) |
米国の社会保障番号と一致します。 形式、型、および指定された入力フィールドの長さを検証します。 一致する文字列には、3 つの数値とそれに続くダッシュ、2 つの数値とそれに続くダッシュ、4 つの数値を含む必要があります。 | 真実 |
IsMatch( "111-111-111", "\d{3}-\d{2}-\d{4}" ) |
前の例と同じですが、入力内のハイフンの 1 つが所定の位置外にあります。 | 間違い |
IsMatch( "AStrongPasswordNot", "(?!^[0-9]\*$)(?!^[a-zA-Z]\*$)([a-zA-Z0-9]{8,10})" ) |
最低 1 つの数字と最低 1 つの英文字に加えて、8、9 または10 文字が含まれている強力なパスワードを検証します。 この文字列には特殊文字を含めることができません。 | 間違い |
Match および MatchAll の例
計算式 | 内容 | 結果 |
---|---|---|
Match( "Bob Jones <bob.jones@contoso.com>", "<(?<email>" & Match.Email & ")>" |
連絡先情報の電子メール部分のみを抽出します。 | { 電子メール: "bob.jones@contoso.com"、 FullMatch: "<bob.jones@contoso.com>"、 SubMatches: [ "bob.jones@contoso.com" ]、 StartMatch: 11 } |
Match( "Bob Jones <InvalidEmailAddress>", "<(?<email>" & Match.Email & ")>" |
連絡先情報の電子メール部分のみを抽出します。 有効な住所が見つからない (@ 記号がない) ため、関数はblankに返します。 | 空白 |
Match( Language(), "(<language>\w{2})(?:-(?<script>\w{4}))?(?:-(?<region>\w{2}))?" ) |
言語、スクリプト、および地域の Language 関数が返す言語タグの一部を抽出します。 これらの結果は米国を反映しています; その他の例については、Language 関数ドキュメント を参照してください。 (?: 別のサブマッチを作成しない文字グループの演算子。 | { language: "en", script: blank, region: "US", FullMatch: "en-US"、 SubMatches: [ "en", "", "US" ]、 StartMatch: 1 } |
Match( "PT2H1M39S", "PT(?:<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ) |
ISO 8601 期間値から時間、分、秒を抽出します。 抽出された数値はテキスト文字列のままです; 算術演算が実行される前に数値に変換するのにValue 関数を使用します。 | { hours: "2", minutes: "1", seconds: "39", FullMatch: "PT2H1M39S", SubMatches: [「2」、「1」、「39」 ]、 StartMatch: 1 } |
最後の例の詳細をより細かく見てみましょう。 Time 関数を使用してこの文字列を日付/時刻値に変換したい場合は、名前付きサブマッチを個別に渡す必要があります。 これを行うには、Match が返すレコードを操作する With 関数を使用できます:
With(
Match( "PT2H1M39S", "PT(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ),
Time( Value( hours ), Value( minutes ), Value( seconds ) )
)
これらの例では、Button コントロールを追加し、OnSelect プロパティをこの計算式に設定し、ボタンを選択します:
Set( pangram, "The quick brown fox jumps over the lazy dog." )
計算式 | 内容 | 結果 |
---|---|---|
Match( pangram, "THE", IgnoreCase ) |
パングラム変数に含まれるテキスト文字列で「THE」に一致するものをすべて検索します。 文字列には 2 つの一致が含まれていますが、MatchAll ではなく Match を使用しているため、最初の一致のみが返されます。 サブマッチが定義されていないため、SubMatches 列は空です。 | { FullMatch: "The", SubMatches: [ ]、 StartMatch: 32 } |
MatchAll( pangram, "the" ) |
パングラム変数に含まれるテキスト文字列で「THE」に一致するものをすべて検索します。 テストでは大文字と小文字が区別されるため、「the」の 2 番目のインスタンスのみが見つかりました。 サブマッチが定義されていないため、SubMatches 列は空です。 | |
MatchAll( pangram, "the", IgnoreCase ) |
パングラム変数に含まれるテキスト文字列で「THE」に一致するものをすべて検索します。 この場合、テストでは大文字と小文字が区別されないため、単語の両方のインスタンスが見つかりました。 サブマッチが定義されていないため、SubMatches 列は空です。 | |
MatchAll( pangram, "\b\wo\w\b" ) |
中央に "o" がある 3 文字の単語をすべて検索します。 「茶色」は 3 文字の単語ではないため除外され、"\b" (単語の境界線) に一致しないことに注意してください。 | |
Match( pangram, "\b\wo\w\b\s\*(?<between>\w.+\w)\s\*\b\wo\w\b" ) |
「fox」と「dog」の間のすべての文字に一致します。 | { between:"jumpsoverthelazy"、 FullMatch: "fox jumps over the lazy dog"、 SubMatches: [ "jumps over the lazy" ], StartMatch: 17 } |
ギャラリーで MatchAll の結果を参照:
空の画面で、空白の垂直のGallery コントロールを挿入します。
ギャラリーの Items プロパティに MatchAll ( pangram, "\w+" ) または MatchAll( pangram, MultipleLetters ) を設定します。
ギャラリーのテンプレートを選択するため、ギャラリー コントロールの中央にある「挿入タブからアイテムを追加」を選択します。
Label コントロールをギャリーのテンプレートに追加します。
ラベルの Text プロパティを ThisItem.FullMatch に設定します。
ギャラリーは、サンプル テキストの各単語が設定されます。 1 つの画面ですべての単語を表示するには、ギャラリーのテンプレートおよびラベル コントロールのサイズを変更します。