IsMatch、Match、および MatchAll 関数

適用対象: Canvas アプリ モデル駆動型アプリ Power Platform CLI

一致をテストするか、パターンに基づいてテキスト文字列の一部を抽出します。

内容

IsMatch 関数は、通常文字、事前定義済みのパターン、または正規表現 が含まれたパターンにテキスト文字列が一致するかどうかをテストします。 Match および MatchAll 関数は、サブマッチを含め、一致したものを返します。

IsMatch は、ユーザーがText input コントロールに入力した内容を検証するために使用します。 たとえば、データ ソースに結果が保存される前に、ユーザーが有効な電子メール アドレスを入力したかどうかを確認できます。 エントリが条件に一致しない場合、エントリの修正をユーザーに求める他のコントロールを追加します。

Match を使用してパターンに照合する最初のテキスト文字列を抽出し、MatchAll を使用して一致するすべてのテキスト文字列を抽出します。 複雑な文字列を解析するためにサブマッチを抽出することもできます。

Match は見つかった最初の一致に関する情報のレコードを返し、MatchAll は見つかったすべての一致に関するレコードのテーブルを返します。 レコードまたはレコードには次のものが含まれます:

Column タイプ 説明設定
名前付きサブの一致、またはサブの一致 Text それぞれの名前付きサブマッチには、独自の列があります。 正規表現で (?<名前>...) を使用して名前付きサブマッチを作成します。 名前付きサブマッチの名前が事前定義済みの列 (下記) の 1 つと同じである場合、サブマッチが優先され、警告が生成されます。 この警告を回避するには、サブマッチの名前を変更します。
FullMatch テキスト 一致したすべてのテキスト文字列。
StartMatch 番号 入力テキスト文字列内での一致の開始位置。 文字列の最初の文字は 1 を返します。
SubMatches テキストの単一列テーブル (列 Value) 正規表現に表示されている順序の、名前付きおよび名前なしのサブマッチのテーブル。 通常、名前付きサブマッチは操作が簡単であり、推奨されています。 個々のサブマッチを使用したForAll 関数またはLast ( FirstN( ... ) ) 関数を使用します。 サブマッチが正規表現で定義されていない場合、このテーブルは存在しますが空になります。

これらの関数はMatchOptions をサポートします。 既定:

  • これらの関数は、大文字と小文字を区別する一致を実行します。 大文字と小文字を区別しない照合を実行するには MatchOptions.IgnoreCase を使用します。
  • Match および MatchAll がテキスト文字列 (MatchOption を含む) の任意の場所で一致を検索する間、IsMatch はテキスト文字列全体 (MatchOption 完了) と一致します。 シナリオに応じて完了含むBeginsWith、または EndsWith を使用します。

IsMatch は、テキスト文字列がパターンに一致する場合は true を返し、一致しない場合は false を返します。 Match は、IsBlank 関数でテストできる一致が見つからない場合、blankを返します。 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 列挙型 内容 正規表現
Any 任意の文字と一致します。 .
Comma コンマと一致します。 ,
Digit 1 桁の数と一致します ("0"~"9")。 \d
メール "at" 記号 ("@") およびドット (".") が付いたドメイン名が含まれている電子メール アドレスと一致します .+\@.+\\.[^\\.]{2,}
Hyphen ハイフンと一致します。 \-
LeftParen 左かっこ "(" と一致します。 \(
Letter 文字と一致します。 \p{L}
MultipleDigits 1 桁以上の数と一致します。 \d+
MultipleLetters 1 つ以上の文字と一致します。 \p{L}+
MultipleNonSpaces 空白 (スペース、タブまたは改行) を追加しない 1 つ以上の文字と一致します。 \S+
MultipleSpaces 空白 (スペース、タブ、または改行) を追加する 1 つ以上の文字と一致します。 \s+
NonSpace 空白を追加しない 1 文字と一致します。 \S
OptionalDigits 0、または 1 桁以上の数と一致します。 \d*
OptionalLetters 0 または 1 文字以上と一致します。 \p{L}*
OptionalNonSpaces 空白文字を追加しない 0 または 1 文字以上と一致します。 \S*
OptionalSpaces 空白文字を追加する 0 または 1 文字以上と一致します。 \s*
Period ピリオドまたはドット (「.」) と一致します。 \.
RightParen 右かっこ ")" と一致します。 \)
Space 空白を追加する 1 文字と一致します。 \s
Tab タブの文字と一致します。 \t

たとえば、パターン "A" & MultipleDigits は、後ろに 1 桁以上続く文字「A」と一致します。

正規表現

これらの関数が使用するパターンは正規表現 です。 このトピックの前半に定義された、通常文字および事前定義済みのパターンは、正規表現の構築に役立ちます。

正規表現は非常に強力で、多数のプログラミング言語で使用可能であり、さまざまな目的で使用されています。 また、ランダムな一連の句読点のように見えることもあります。 この記事では、正規表現のすべての点について説明していませんが、役に立つ貴重な情報、チュートリアル、およびツールが Web 上で使用可能です。

正規表現にはさまざまな方言があり、Power Apps では JavaScript の方言のバリアントを使用します。 構文の紹介に関しては、正規表現の構文 を参照します。 名前付きサブマッチ (名前付きキャプチャ グループと呼ばれることもあります) がサポートされています:

  • 名前付きサブマッチ: (?<name> ...)
  • 名前付き後方参照: \k<name>

このトピックの前半の Match 列挙型テーブルでは、各列挙型は、対応する正規表現と同じ行に表示されます。

Match オプション

これらの関数の動作は、1 つ以上のオプションを指定して変更することができます。これらのオプションは文字列連結演算子 (&) を使用して組み合わせることができます。

MatchOptions 列挙型 Description 正規表現への影響
MatchOptions.BeginsWith パターンはテキストの先頭から一致する必要があります。 正規表現の先頭に ^ を追加します。
MatchOptions.Complete IsMatch の既定。 パターンは、先頭から末尾までテキストの文字列全体と一致する必要があります。 正規表現の開始位置に ^、末尾に $ を追加します。
MatchOptions.Contains Match および MatchAll の既定。 パターンは、テキストのどこかに表示する必要がありますが、先頭または末尾である必要はありません。 正規表現を変更しません。
MatchOptions.EndsWith パターンはテキストの文字列の末尾と一致する必要があります。 正規表現の末尾に $ を追加します。
MatchOptions.IgnoreCase 大文字と小文字を同じものとして扱います。 既定では、一致は大文字と小文字を区別します。 正規表現を変更しません。 このオプションは、正規表現の標準の「i」修飾子と同等です。
MatchOptions.Multiline 複数の行にわたって一致します。 正規表現を変更しません。 このオプションは、正規表現の標準の「m」修飾子と同等です。

MatchAll を使用することは、正規表現に標準の「g」修飾子を使用することと同じです。

構文

IsMatch( Text, Pattern [, Options ] )

  • Text – 必須。 テストするテキスト文字列。
  • Pattern – 必須。 テキスト文字列としてテストするパターン。 Match 列挙型が定義する事前定義済みのパターンを連結するか、正規表現を提供します。 Pattern は、変数、データソース、またはアプリの実行中に変化するその他の動的参照のない定数式である必要があります。
  • Options – 任意。 MatchOptions 列挙値を組み合わせたテキスト文字列。 既定では MatchOptions.Complete が使用されます。

Match( Text, Pattern [, Options ] )

  • Text – 必須。 一致するテキスト文字列。
  • Pattern – 必須。 テキスト文字列として一致するパターン。 Match 列挙型が定義する事前定義済みのパターンを連結するか、正規表現を提供します。 Pattern は、変数、データソース、またはアプリの実行中に変化するその他の動的参照のない定数式である必要があります。
  • Options – 任意。 MatchOptions 列挙値を組み合わせたテキスト文字列。 既定では、MatchOptions.Complete が使用されます。

MatchAll( Text, Pattern [, Options ] )

  • Text – 必須。 一致するテキスト文字列。
  • Pattern – 必須。 テキスト文字列として一致するパターン。 Match 列挙型が定義する事前定義済みのパターンを連結するか、正規表現を提供します。 Pattern は、変数、データソース、またはアプリの実行中に変化するその他の動的参照のない定数式である必要があります。
  • Options – 任意。 MatchOptions 列挙値を組み合わせたテキスト文字列。 既定では、MatchOptions.Complete が使用されます。

IsMatch の例

通常文字

アプリは TextInput1 という名前の Text input コントロールが含まれていると想像します。 ユーザーはデータベースに格納されるために、このコントロールに値を入力します。

ユーザーは TextInput1Hello World と入力します。

計算式 内容 結果
IsMatch( TextInput1.Text, "Hello world" ) ユーザーの入力が文字列「Hello World」に正確に一致するかどうかをテストします。 True
IsMatch( TextInput1.Text, "Good bye" ) ユーザーの入力が文字列「Good bye」に完全に一致するかどうかをテストします。 false
IsMatch( TextInput1.Text, "hello", Contains ) ユーザーの入力に単語「hello」 (大文字と小文字の区別) が含まれているかどうかをテストします。 false
IsMatch( TextInput1.Text, "hello", Contains & IgnoreCase ) ユーザーの入力に単語「hello」 (大文字と小文字を区別しない) が含まれているかどうかをテストします。 True

事前定義済みパターン

計算式 内容 結果
IsMatch( "123-45-7890", Digit & Digit & Digit & Hyphen & Digit & Digit & Hyphen & Digit & Digit & Digit & Digit ) 米国の社会保障番号と一致します True
IsMatch( "joan@contoso.com", Email ) 電子メール アドレスと一致します True
IsMatch( "123.456", MultipleDigits & Period & OptionalDigits ) 一連の数字、ピリオド、0 以上の数字と一致します。 True
IsMatch( "123", MultipleDigits & Period & OptionalDigits ) 一連の数字、ピリオド、0 以上の数字と一致します。 一致するテキストにピリオドが表示されないため、このパターンは一致されません。 false

正規表現

計算式 内容 結果
IsMatch( "986", "\d+" ) 0 以上の整数と一致します。 True
IsMatch( "1.02", "\d+(\.\d\d)?" ) 正の通貨金額と一致します。 入力に小数点が含まれる場合、入力には小数点の後ろに 2 つの数値が含まれている必要があります。 たとえば、3.00 は有効ですが、3.1 は無効です。 True
IsMatch( "-4.95", "(-)?\d+(\.\d\d)?" ) 正または負の通貨金額と一致します。 入力に小数点が含まれる場合、入力には小数点の後ろに 2 つの数値が含まれている必要があります。 True
IsMatch( "111-11-1111", "\d{3}-\d{2}-\d{4}" ) 米国の社会保障番号と一致します。 形式、型、および指定された入力フィールドの長さを検証します。 一致する文字列には、3 つの数値とそれに続くダッシュ、2 つの数値とそれに続くダッシュ、4 つの数値を含む必要があります。 True
IsMatch( "111-111-111", "\d{3}-\d{2}-\d{4}" ) 前の例と同じですが、入力内のハイフンの 1 つが所定の位置外にあります。 false
IsMatch( "AStrongPasswordNot", "(?!^[0-9]\*$)(?!^[a-zA-Z]\*$)([a-zA-Z0-9]{8,10})" ) 最低 1 つの数字と最低 1 つの英文字に加えて、8、9 または10 文字が含まれている強力なパスワードを検証します。 この文字列には特殊文字を含めることができません。 false

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に返します。 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。
MatchAll( pangram, "the", IgnoreCase ) パングラム変数に含まれるテキスト文字列で「THE」に一致するものをすべて検索します。 この場合、テストでは大文字と小文字が区別されないため、単語の両方のインスタンスが見つかりました。 サブマッチが定義されていないため、SubMatches 列は空です。 IgnoreCase を使用した MatchAll。
MatchAll( pangram, "\b\wo\w\b" ) 中央に "o" がある 3 文字の単語をすべて検索します。 「茶色」は 3 文字の単語ではないため除外され、"\b" (単語の境界線) に一致しないことに注意してください。 b、wo、w、b のパングラムの MatchAll。
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 の結果を参照:

  1. 空の画面で、空白の垂直のGallery コントロールを挿入します。

  2. ギャラリーの Items プロパティに MatchAll ( pangram, "\w+" ) または MatchAll( pangram, MultipleLetters ) を設定します。

    アイテム ギャラリー。

  3. ギャラリーのテンプレートを選択するため、ギャラリー コントロールの中央にある「挿入タブからアイテムを追加」を選択します。

  4. Label コントロールをギャリーのテンプレートに追加します。

  5. ラベルの Text プロパティを ThisItem.FullMatch に設定します。

    ギャラリーは、サンプル テキストの各単語が設定されます。 1 つの画面ですべての単語を表示するには、ギャラリーのテンプレートおよびラベル コントロールのサイズを変更します。

    Text プロパティ。