IsMatch、Match、MatchAll の関数 は、テキスト内のパターンの抽出と検証に使用されます。 このそれらが使うパターンは、正規表現 です。
正規表現は強力で用途が広いです。 ただし、ランダムな一連の句読点として表示される場合があります。 この記事では、正規表現のすべての点について説明していませんが、役に立つ貴重な情報、チュートリアル、ツールがオンラインで使用可能です。
正規表現には長い歴史があり、多くのプログラミング言語で使用できます。 すべてのプログラミング言語には独自の方言の正規表現があり、標準はほとんどありません。 可能な限り、すべての Power Fx 実装で同じ正規表現が同じ結果が得られるよう努めています。 互換性は、大きな違いがある JavaScript と .NET の上で Power Fx として実行されるため、実現するのは簡単ではありません。 さまざまなプラットフォームで実行するために、Power Fx 正規表現は、業界で広くサポートされている機能のサブセットを使用します。
その結果、他の環境で機能する一部の正規表現がブロックされたり、Power Fx での調整が必要になる場合があります。 サポートされていない機能が検出されると、作成時のエラーが報告されます。 このため、正規表現とオプションは、変数で指定するなど、動的ではなく、作成時の定数である必要があります。
注意
Power Apps では、以前のバージョンの Power Fx 正規表現が使用されます。このバージョンは制限が少ないですが、機能も少ないです。 MatchOptions.DotAll と MatchOptions.FreeSpacing は使用できず、Match.Email と Match.Hyphen の定義は異なります。 Unicode サロゲート ペアは 1 文字として扱われません。 MatchOptions.NumberedSubMatches がデフォルトです。 ここで説明する正規表現のバージョンは、Power Fx V1.0 互換性スイッチの下で近日中に Power Apps で利用可能になります。
サポートされている機能
Power Fx は、次の正規表現機能をサポートしており、Power Fx の動作が他のシステムとどのように異なるかについての説明があります。
正規表現は定数である必要があり、計算したり変数に格納したりすることはできません。
& 演算子、文字列補間$"{...}"、定数引数を持つ Concatenate、 Char、UniChar の関数がサポートされています。
リテラル文字
| 特徴 | プロパティ |
|---|---|
| リテラル文字 | Unicode 文字は、\、[、]、^、$、.、|、?、*、+、(、)、{、} を除き、直接挿入できます。
MatchOptions.FreeSpacing を使用する場合、#、 、その他の \s スペース文字は意味が異なるため、エスケープする必要があります。 |
| エスケープされたリテラル文字 |
\ (バックスラッシュ) の後に直接リテラル文字の 1 つ、たとえば \? を使用して疑問符を挿入します。
\# と \ は、一貫性を保つために MatchOptions.FreeSpacing が無効になっている場合でも使用できます。 |
| 16 進数と Unicode 文字コード | 正確に 2 桁の 16 進数の \x20、正確に 4 桁の 16 進数の \u2028、そして上位と下位のサロゲートに使用できます。 |
| Unicode コード ポイント | 最大 8 桁の 16 進数の \u{01F47B}。 0 から U+10FFFF の範囲で指定する必要があり、上位サロゲートまたは下位サロゲートには使用できません。 U+FFFF より大きい場合、サロゲート ペア (2 文字) になる可能性があります。 |
| キャリッジリターン |
\r、Char(13) と同様。 |
| 改行文字 |
\n、Char(10) と同様。 |
| フォームフィード |
\f、Char(12) と同様。 |
| 水平方向のタブ |
\t、Char(9) と同様。 |
\x か \u を代わりに使用します。
\044 または \o{044} などの文字の 8 進コードは、番号付き後方参照であいまいになる可能性があるため、許可されません。
\v は、正規表現言語間であいまいであるため、サポートされていません。 垂直タブには \x0b または [\x0b\f\r\n\x85\u2028\u2029] 垂直空白に使用します。
アサーション
アサーションはテキスト内の特定の位置と一致しますが、文字は消費されません。
| 特徴 | プロパティ |
|---|---|
| 行の始点 |
^は、テキストの先頭、または MatchOptions.Multiline が使用されている場合は行の先頭と一致します。 |
| 行末 |
$ は、テキストの最後または MatchOptions.Multiline が使用されている場合は行の先頭と一致します。 |
| 先読み |
(?=a) と (?!a)、パターンに先行して一致します。 |
| 後読み |
(?<=b) と (?<!b)、パターンの後に一致します。 |
| 改行 | Unicode の文字定義 \b を使用した \B と [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。 |
$ は、\r\n、\r、または \n を含む行の末尾と一致します。
先読みアサーションと後読みアサーションには、サブマッチまたは無制限の量指定子を含めることはできず、外部の量指定子と共に使用することもできません。
文字クラス
| 特徴 | プロパティ |
|---|---|
| Dot |
. は、\r が使用されない限り、\n と を除くすべてに一致します。 |
| 文字クラス |
[abc] 文字のリスト、[a-fA-f0-9] 文字の範囲、[^a-z] これらの文字以外のすべて。 文字クラスを入れ子にしたり、減算したり、交差させたりすることはできず、多くの句読点 (@@、%%、!! など) を連続して 2 回表示することはできません。 |
| 言語の文字 | Unicode の文字定義 \w を使用した \W と [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。
\W は否定文字クラスでは使用できません。 |
| 数字の文字 |
\d 数字 0 から 9 と \p{Nd} を含み、\D は \d に一致しないすべての文字に一致します。
\D は否定文字クラスでは使用できません。 |
| 空白の文字 |
\s には、[ \t\n\x0b\f\r\x85\u2028\u2029\p{Z}] に一致する文字を除くすべてに一致するスペーシング文字 \S、\s が含まれます。
\S は否定文字クラスでは使用できません。 |
| Unicode 文字カテゴリ |
\p{Ll} はすべての Unicode 小文字に一致し、\P{Ll} は Unicode 小文字でないすべての文字と一致します。
\P{} は否定文字クラスでは使用できません。 |
明瞭さを高め、曖昧さを避けるために、角括弧文字クラスは他の正規表現言語よりも制限が厳しくなっています。
- リテラルのハイフン文字はエスケープする必要があります。
[\-a]の代わりに[-a]を使用して、-かaに一致させます。 - 先頭の角括弧はエスケープする必要があります。
[\[a]の代わりに[[]を使用して、[かaに一致させます。 - 最初の文字で否定を示す場合を除き、その文字はエスケープする必要があります。
[a\^]の代わりに[a^]を使用して、^かaに一致させます。 - 中括弧はエスケープする必要があります。
[\{\}]を使用して{または}に一致させます。 - 空の文字クラス
[]はサポートされていません。 文字クラスに閉じ角かっこを含めるには、エスケープします。
\p{} と \P{} でサポートされている Unicode 文字カテゴリ:
- レター:
L、Lu、Ll、Lt、Lm、Lo - マーク:
M、Mn、Mc、Me - 番号:
N、Nd、Nl、No - 句読点:
P、Pc、Pd、Ps、Pe、Pi、Pf、Po - シンボル:
S、Sm、Sc、Sk、So - 区切り記号:
Z、Zs、Zl、Zp - 制御と書式:
Cc、Cf、その他のC接頭辞カテゴリはサポートされていません。
\W、\D、\S、\P{} は否定文字クラス [^...] では使用できません。 一部のプラットフォームで実装するために、これらの否定文字クラスは Unicode と同等のものに変換されますが、否定されると変換が難しい場合があります。
サロゲート ペアを必要とする U+10000 から U+10FFFF までの Unicode 文字は、文字クラスではサポートされていません。
量指定子
| 特徴 | プロパティ |
|---|---|
| 貪欲な 0 または 1 |
? は、可能な限り 大きな 一致として 0 回または 1 回一致します。 |
| 貪欲な 0 個以上 |
* は、可能な限り 大きな 一致として 0 回以上一致します。 |
| 1 つ以上の貪欲 |
+ は、可能な限り 大きな 一致として 1 回以上一致します。 |
| 少なくとも n の貪欲 |
{n,} は、可能な限り 大きな 一致として少なくとも n 回以上一致します。 たとえば、a{3,} は aaaaa のすべての文字と一致します。 |
| n と m の間で貪欲 |
{n,m} は、可能な限り 大きな 一致として少なくとも n 回と m 回以上一致します。 たとえば、a{1,3} は aaaaa の最初の 3 文字と一致します。 |
| 怠惰な 0 または 1 |
?? は、可能な限り ちいさな 一致として 0 回または 1 回一致します。 |
| 怠惰な 0 回以上 |
*? は、可能な限り 小さな 一致として 0 回以上一致します。 |
| 怠慢な 1 回以上 |
+? は、可能な限り 小さな 一致として 1 回以上一致します。 |
| 少なくとも n の怠慢 |
{n,}? は、可能な限り 小さな 一致として少なくとも n 回以上一致します。 たとえば、a{3,}? は aaaaa の最初の 3 文字のみと一致します。 |
| n と m の間の貪欲 |
{n,m}? は、可能な限り 小さな 一致として少なくとも n 回と m 回以上一致します。 たとえば、a{1,3}? は aaaaa の最初の文字のみと一致します。 |
| 完全な n |
{n} は正確に n 回一致します。 たとえば、a{3} は完全に aaaaa の最初の 3 文字と一致します。 |
所有量指定子はサポートされていません。
サブマッチと量指定子の混在には制限があります。 詳細については、空のサブマッチの可能性 を参照してください。
Groups
| 特徴 | プロパティ |
|---|---|
| Group |
( と ) は、量指定子を適用する要素をグループ化するために使用されます。 たとえば、(abc)+ は abcabc と一致します。 |
| 代替 |
a|b はグループでよく使用される "a" または "b" と一致します。 |
| 名前付きサブマッチと後方参照 |
(?<name>chars) は name という名前のサブマッチをキャプチャし、\k<name> で参照されます。
MatchOptions.NumberedSubMatches が有効になっている場合は使用できません。 |
| 番号付きサブマッチと後方参照 |
MatchOptions.NumberedSubMatches が有効な場合、(a) は \1 で参照されるサブマッチをキャプチャします。 |
| 非キャプチャ グループ |
(?:a) は、結果を名前付きまたは番号付きサブマッチとしてキャプチャせずにグループを作成します。
MatchOptions.NumberedSubMatches が有効になっていない限り、すべてのグループはキャプチャされないグループです。 |
名前付きサブマッチと番号付きサブマッチを一緒に使用することはできません。 既定では、名前付きサブマッチは有効になっており、明確さと保守性のために優先されますが、標準キャプチャ グループはパフォーマンスが向上した非キャプチャ グループになります。 この動作は、従来のキャプチャ グループを提供しますが、名前付きキャプチャ グループを無効にする MatchOptions.NumberedSubMatches で変更できます。 一部の実装では、番号付きキャプチャ グループと名前付きキャプチャ グループの組み合わせを異なる方法で処理するため、Power Fx はこれを禁止しています。
自己参照キャプチャ グループは例えば正規表現 (a\1) サポートされていません
2 つのキャプチャ グループで同じ名前を共有することはできません (たとえば、正規表現 (?<id>\w+)|(?<id>\d+) はサポートされていません)。
名前付きサブマッチの名前は、\p{L} 文字または _ で始まる必要があり、これらの文字と \p{Nd} で続けることができます。 名前の長さは 62 UTF-16 コード単位に制限されています。
空の可能性があるサブマッチや、後読みまたは先読み内のサブマッチへの後方参照もサポートされていません。
一部の実装では、パフォーマンスを向上させるために "明示的なキャプチャ" オプションを提供していますが、これはデフォルトであるため Power Fx では不要です。 MatchOptions.NumberedSubMatches を無効にすると、暗黙的に番号が付けられたキャプチャが有効になります。
サブマッチと量指定子の混在には制限があります。 詳細については、空のサブマッチの可能性 を参照してください。
Comments
| 特徴 | プロパティ |
|---|---|
| インライン コメント |
(?# comment here)、これはコメントとして無視されます。 コメントは、左かっこがコメント内にある場合でも、次の右かっこで終わります。 |
正規表現の書式設定とコメントの追加方法については MatchOptions.FreeSpacing を参照してください。
インラインのオプション
| 特徴 | プロパティ |
|---|---|
| インラインのオプション |
(?im) は、MatchOptions.IgnoreCase と MatchOptions.Multiline を使用するのと同じです。 正規表現の先頭に設定する必要があります。 |
サポートされているインライン モードは [imsx] です。 これらはそれぞれ MatchOptions.IgnoreCase、MatchOptions.Multiline、MatchOptions.DotAll、MatchOptions.FreeSpacing に対応します。
n は互換性のために受け入れられますが、デフォルトであり、MatchOptions.NumberedSubMatches と互換性がないため、効果はありません。
インライン オプションを使用して、オプションを無効にしたり、部分式のオプションを設定したりすることはできません。
オプション
一致オプションは、正規表現の一致の動作を変更します。 オプションを有効にするには 2 つの方法があり、競合がない限り混在させることができます。
-
MatchOptions 列挙型は、Match、 MatchAll、IsMatch に 3 番目の引数として渡されます。 オプションは、たとえば
&など、Concatenate演算子やMatchOptions.DotAll & MatchOptions.FreeSpacing関数と組み合わせることができます 。 すべての正規表現関数では、MatchOptions が定数値である必要があり、計算したり変数に格納したりすることはできません。 -
(?...)接頭辞を正規表現の先頭に付けます。 オプションは、たとえば(?...)など(?sx)構造で複数の文字と組み合わせることができます 。 一部のオプションには(?...)同等のものはありませんが、同じ効果を得る他の方法がある場合があります。たとえば、MatchOptions.BeginsWith は正規表現の先頭にある^と同等です。
次を含む
MatchOptions.Contains は正規表現テキストの同等物なしで有効です。 MatchOptions.Contains は Power Apps の外のすべての関数の既定値です。Power Apps 内では、MatchOptions.Complete は IsMatch の既定値です。
Complete
MatchOptions.Complete で有効にするか、正規表現の先頭と末尾にそれぞれ ^ と $ を使用します。
BeginsWith
MatchOptions.BeginsWith で有効にするか、正規表現の先頭と末尾にそれぞれ ^ を使用します。
EndsWith
MatchOptions.EndsWith で有効にするか、正規表現の末尾にそれぞれ $ を使用します。
ドットオール
MatchOptions.DotAll で有効にするか、正規表現の始めにそれぞれ (?s) を使用します。
通常、ドット . 演算子は、改行文字 [\n\x0b\f\r\x85\u2028\u2029] を除くすべての文字に一致します。
DotAll 修飾子を使用すると、改行を含むすべての文字が照合されます。
この例では、既定では . は改行と一致しないため、"Hello" のみと一致します。
Trim( Match( "Hello
World", ".*" ).FullMatch )
// returns
// "Hello"
ただし、DotAll 修飾子を追加すると、改行と後続のすべての文字が一致します。
Trim( Match( "Hello
World", ".*", MatchOptions.DotAll ).FullMatch )
// returns
// "Hello
// World"
フリースペーシング
MatchOptions.FreeSpacing で有効にするか、正規表現の始めにそれぞれ (?x) を使用します。
フリースペーシングにより、複雑な正規表現が読みやすくなり、維持しやすくなります。 ルールは簡単です。
- 空白文字は、正規表現内で一致するすべての文字を含めて無視されます
\s。 スペースを一致させる必要がある場合は、\s、\、\t、\r、\nを使用します。 -
#は行末まで続くコメントを開始します。 それと、次の改行文字に続くすべての文字(.なしの で一致しない文字)は無視されます。 - 文字クラスは、これらの変更に含まれません。 スペース文字と
#は通常どおりに動作します。 たとえば、IsMatch( "a#b c", "(?x)a[ #]b[ #]c" )は、この true を返します。 一部の正規表現言語では、フリースペースに文字クラスが含まれていたり、文字クラスを含めるオプションが提供されていますが、Power Fx には含まれていません。
たとえば、ISO 8601 日時 を照合するための複雑な正規表現を次に示します。
IsMatch(
"2025-01-17T19:38:49+0000",
"^\d{4}-(0\d|1[012])-([012]\d|3[01])(T([01]\d|2[0123]):[0-5]\d(:[0-5]\d(\.\d{3})?)?(Z|[\-+]\d{4}))?$"
)
// returns true
また、複数の行を利用したフリースペース、グループのインデント、正規表現のコメントを含む同一の正規表現を次に示します。このバージョンは理解しやすく、検証しやすく、維持しやすくなっています。
IsMatch( "2025-01-17T19:38:49+0000",
"(?x) # enables free spacing, must be very first
^ # matches from beginning of text
\d{4} # year (0000-9999)
-(0\d|1[012]) # month (00-12)
-([012]\d|3[01]) # day (00-31, range not checked against month)
(T([01]\d|2[0123]) # optional time, starting with hours (00-23)
:[0-5]\d # minutes (00-59)
(:[0-5]\d # optional seconds (00-59)
(\.\d{3})? # optional milliseconds (000-999)
)?
(Z|[\-+]\d{4}) # time zone
)?
$ # matches to end of text
"
)
// returns true
IgnoreCase
MatchOptions.IgnoreCase で有効にするか、正規表現の始めにそれぞれ (?i) を使用します。
大文字と小文字を区別しない文字のテキストと一致します。大文字は小文字と一致し、小文字は大文字と一致します。
例:
IsMatch( "HELLO!", "hello", MatchOptions.IgnoreCase )
// returns true
IsMatch( "file://c:/temp/info.txt", "^FILE://", MatchOptions.IgnoreCase )
// returns true
ほとんどの部分または Power Fx はカルチャに対応していますが、ここではそうではありません。 カルチャ不変一致の使用は、JavaScript や Perl などの正規表現の業界標準です。 これは、システム リソースが照合される 2 番目の例で役立ちます。たとえば、tr-TR カルチャで、I が i の大文字と同等ではない場合です。
カルチャを意識し、大文字と小文字を区別しない一致が必要な場合は、代わりに一致する文字を持つ文字クラスを使用します (最初の例として [Hh][Ee][Ll][Ll][Oo] など)。
複数行
MatchOptions.Multiline で有効にするか、正規表現の始めにそれぞれ (?m) を使用します。
通常、^ アンカーと $ アンカーは入力テキストの先頭と末尾に一致します。
Multiline 修飾子を使用すると、これらのアンカーは、各行が \r、\n、\r\n、または入力の終わりで終わる入力テキストの行の先頭と末尾に一致します。 例:
MatchAll( "Hello" & Char(13) & Char(10) & "World", "^.+$" )
// returns
// "Hello"
事前定義済みパターン
事前定義済みのパターンは、文字セットの 1 つ、または一連の複数の文字を一致させる方法を提供します。 独自のテキスト文字列と Match 列挙型のメンバーを組み合わせるため、文字列連結演算子 & を使用します。
| Match 列挙型 | プロパティ | 正規表現 |
|---|---|---|
| Any | 任意の文字と一致します。 | . |
| Comma | コンマ , と一致します。 |
, |
| Digit | 1 桁の数字と一致します (0 から 9 とその他の \p{Nd} メンバー)。 |
\d |
| 電子メール | "at" 記号 (@) と、少なくとも 1 つのドット (.) を含むドメイン名を持つメール アドレスに一致し、空白と句読点で区切られています。 |
注記 |
| 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" & Match.MultipleDigits は、後ろに 1 桁以上続く文字 "A" と一致します。
Match.Email パターンは他のパターンよりも複雑です。 local@hostname.tld の形式で、一般的なメールアドレスを検出して抽出し、場合によっては長いテキストからも検出でき、国際的な文字と絵文字をサポートします。 これを使用して、入力としてメール アドレスを受け取るフォームを検証し、入力が電子メール形式であることをすばやくテストします。 抽出しない場合は、MatchOptions.Complete を使用して、テキスト入力コントロールなどでメール アドレスを検出します。
ただし、Match.Email は、メール アドレス、ドメイン名、トップレベル ドメインに関する多くの進化する標準のすべてに準拠していることを検証しません。これには、時々更新する必要がある複雑な正規表現が必要です。 ほとんどのメールアドレスは期待どおりに扱われますが、Match.Email は、ホスト名のアンダースコアなどの一部の無効なケースに一致し、引用符で囲まれたメールアドレスや IP アドレスなどの一部の有効なケースには一致しません。 必要に応じて、真に有効なメール アドレスを検出するための Web 上の多くの正規表現があります。 本番環境で使用する前に、必ず特定のニーズに合わせて正規表現をテストしてください。
使用されている正規表現を確認する場合は、Text( Match.Email ) 数式を評価します。 最初の部分は、@ の前の文字と一致し、RFC 822 およびリビジョン に従って 一般的な ASCII 句読点と、抽出を容易にするための Unicode の先頭と末尾の句読点 (、[、“、«、「 などは除外されます。 引用符で囲まれた文字列やコメントの一般的でなく推奨されない使用はサポートされていません。
@ に続いて、正規表現の 2 番目と 3 番目の部分は同じで、. で区切られているため、アドレスには常に少なくとも 1 つの . があります。 これらの部分では、.、-、_ を除くすべての Unicode 句読点が除外されます。 IP アドレスはサポートされていません。 メールアドレス全体で、国際文字と絵文字がサポートされています。
Power Apps、Power Fx 1.0を使用しない場合、Match.Email と Match.Hyphen の定義は若干異なります。 Match.Email はよりシンプルですが、スペースをキャプチャするため、メール アドレスの抽出には適していません。 以前は、Match.Hyphen は文字クラスの外部でエスケープされていましたが、現在は不正です。
NumberedSubMatches (番号付きサブマッチ)
インライン オプションなしで MatchOptions.NumberedSubMatches で有効になります。
(?n) は、互換性のためにこのオプションの反対としてサポートされており、デフォルトです。
デフォルトでは、(...) はキャプチャしません。これは、ほとんどのシステムが "明示的なキャプチャ" と呼ぶものに相当します。キャプチャするには、(?<name>...) を使用して名前付きキャプチャを行い、\k<name> で後方参照を使用します。 名前付きキャプチャを使用すると、不要なグループをキャプチャしないこと、名前を使用することで明確さが向上し、キャプチャの位置が変更されてもエラーが発生しにくくなるため、パフォーマンスが向上します。
既存の正規表現がある場合は、自動的にキャプチャされ、番号付き後方参照を含む番号が付けられるグループに依存する可能性があります。 この動作は、MatchOptions.NumberedSubMatches オプションを使用できます。
名前付きサブマッチと番号付きサブマッチを一緒に使用することはできません。 一部の実装では、番号付きキャプチャ グループと名前付きキャプチャ グループの組み合わせを異なる方法で処理するため、Power Fx はこれを禁止しています。
空白のサブマッチの可能性
冒頭で説明したように、Power Fx の正規表現は、.NET、JavaScript、およびその他のプログラミング言語の正規表現エンジンに一貫して実装できる機能に意図的に制限されています。 作成時のエラーにより、このセットに含まれていない機能を使用できません。
実装間で異なる可能性がある領域の 1 つは、空のサブマッチの処理方法です。 たとえば、正規表現 (?<submatch>a*)+ がテキスト a を照合するように求められたとします。 .NET では、サブマッチの結果は空のテキスト文字列になりますが、JavaScript では a になります。 グループの内容には + 量指定子があるため、* 量指定子は空の文字列で満たすことができるため、どちらも正しい実装であると主張できます。
異なる実装間で結果が異なることを避けるために Power Fx 空である可能性があるサブマッチを量指定子で使用することはできません。 サブマッチが空になる可能性がある例を次に示します。
| 使用例 | プロパティ |
|---|---|
(?<submatch>a{0,}b*)+ |
サブマッチの内容はすべて省略可能であるため、サブマッチ全体が空になる場合があります。 |
((<submatch>a)?b)+ |
サブマッチの外部にある ? ため、サブマッチ全体は省略可能です。 |
(?<submatch>a|b*)+ |
サブマッチ内で空の可能性があるものと交互に使用すると、サブマッチ全体が空になる可能性があります。 |
((?<submatch>a)|b)+ |
サブマッチの外側の代替は b と一致する可能性があり、その場合、サブマッチは空になります。 |
(?<submatch>a+)+ のサブマッチには少なくとも 1 つ a が必要であり、サポートされているため、サブマッチを空にすることはできません。
Unicode
Power Fx 正規表現では、Unicode カテゴリを使用して、\w、\d、\s を定義し、特定のカテゴリを \p{..} で使用できます。
これらの定義は、プラットフォームによって異なる場合があります。 たとえば、Unicode 標準は新しい文字で随時更新され、後でプラットフォームによって独自のペースで実装されます。 すべてのプラットフォームが更新されるまで、プラットフォーム間で結果にばらつきが生じることが予想されます。
Power Fx 正規表現は、基本多言語面 (文字 U+0 から U+ffff) のカテゴリ情報を常に使用できるようにします。 一部のプラットフォームでは、Supplementary Multilingual Plane 以降 (U+10000 から U+10ffff) の文字のカテゴリが実装されていません。 この制限は、Basic Multilingual Plane の文字が最も一般的に使用されるため、通常は問題になりません。 シナリオに U+10000 以上の文字が含まれる場合は、カテゴリではなく文字値を直接使用します。 使用するプラットフォームで正規表現をテストします。
プラットフォーム間で特殊なケースに微妙な違いが存在する場合があります。 たとえば、一部のプラットフォームでは、ſ が呼び出されるときに、s との一致として が認識されない場合があります。 これらの文字がシナリオにとって重要な場合は、大文字と小文字を区別せずに照合し、目的の文字を明示的に含める [ſsS] などの文字クラスを使用します。