規則運算式

IsMatch、 Match 和 MatchAll 函數 用於提取和驗證文本中的模式。 他們使用的模式稱為 正則表達式。

正則表達式功能強大且用途廣泛。 但是,它們有時可以顯示為隨機的標點符號序列。 本文並未描述正則表達式的所有方面,但在線提供了大量資訊、教程和工具。

正則表達式有著悠久的歷史,並且有多種程式設計語言版本。 每種程式設計語言都有自己的正則表達式語法,而且標準很少。 我們盡可能地努力讓相同的正則表達式在所有 Power Fx 實現中給出相同的結果。 相容性並不容易實現,因為 Power Fx 在具有顯著差異的 JavaScript 和 .NET 之上運行。 為了在不同的平台上運行, Power Fx 正則表達式使用了整個行業廣泛支援的功能子集。

因此,一些在其他環境中工作的正則表達式可能會被阻止或需要調整 Power Fx。 當遇到不受支援的功能時,將報告創作時間錯誤。 這就是為什麼正則表達式和選項必須是創作時間常量而不是動態的,例如在變數中提供。

注意

Power Apps 使用早期版本的 Power Fx 正則表達式,該版本的限制較少,但功能也較少。 MatchOptions.DotAll 和 MatchOptions.FreeSpacing 不可用,並且 Match.Email 和 Match.Hyphen 的 定義不同。 Unicode 代理對不被視為單個字元。 MatchOptions.NumberedSubMatches 是預設值。 此處描述的正則表達式版本即將在「 Power Apps V1.0 相容性」開關下提供Power Fx 。

支援的功能

Power Fx 支援以下正則表達式功能,並附有有關行為與其他系統有何 Power Fx 不同的說明。

正則表達式必須是常量的,並且不能計算或存儲在變數中。 & 支持運算符、字串插值 $"{...}"以及具有常量參數的 the Concatenate, Char和 UniChar 函數。

文字字元

特點 Description
文字字元 可以直接插入任何 Unicode 字元, \除了, [, ]^$.|?*+(){}和。 使用 MatchOptions.FreeSpacing、 #、 和其他 \s 空格字元時,必須轉義,因為它們具有不同的含義。
轉義的文字字元 \ (反斜杠)後跟直接文字字元之一,例如 \? 插入問號。 \# 即使 \ 為了一致性而禁用了 MatchOptions.FreeSpacing , 也可以使用。
十六進位和 Unicode 字元代碼 \x20 恰好有兩個十六進位數位, \u2028 恰好有四個十六進位數位,可用於高低代理。
Unicode 代碼點 \u{01F47B} 最多有八位十六進位數位。 必須在 0 到 U+10FFFF 範圍內,不能用於高或低代理。 如果大於 U+FFFF,可能會導致代理對 (兩個字元)。
回車 \r,與 Char(13)。
換行符 \n,與 Char(10)。
表單進給 \f,與 Char(12)。
水平選項卡 \t,與 Char(9)。

使用 \x or \u 代替。 字元的八進位代碼 (例如 \044 或是 \o{044} 不允許的),因為它們可能與編號的反向引用不一致。

\v 不受支援,因為它在正則表達式語言中是不明確的。 用於 \x0b 垂直選項卡或 [\x0b\f\r\n\x85\u2028\u2029] 垂直空格。

斷言

斷言與文本中的特定位置匹配,但不使用任何字元。

特點 Description
行首 ^,匹配文本的開頭,如果使用 MatchOptions.Multiline ,則 匹配行的開頭。
行尾 $,匹配文本的末尾,如果使用 MatchOptions.Multiline ,則 匹配行的末尾。
前瞻 (?=a) 並且 (?!a),為模式提前匹配。
後視 (?<=b) 並且 (?<!b),匹配在後面的模式。
斷字元 \b 並且 \B,使用 Unicode 字母 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]定義。

$ 匹配行尾,包括任何尾隨 \r\n, \r或 \n。

前瞻和後視斷言不能包含子匹配項或內部無限量詞,也不能與外部量詞一起使用。

字元類

特點 Description
點 .,匹配除和 \r except \n 使用 MatchOptions.DotAll 之外 的所有內容。
字元類 [abc] 字元清單, [a-fA-f0-9] 字元範圍, [^a-z] 除了這些字元之外的所有內容。 字元類不能嵌套、減法或相交,並且許多標點符號不得連續出現兩次 (@@, %%, !!,等)。
單詞字元 \w 以及 \W 使用 Unicode 字母 [\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] instead of [-a] 匹配 - or a。
  • 必須轉義開頭方括號。 使用 [\[a] instead of [[] 匹配 [ or a。
  • 除非它是第一個字元並表示否定,否則必須轉義該字元。 使用 [a\^] instead of [a^] 匹配 ^ or a。
  • 必須轉義大利大括號。 用於 [\{\}] 匹配 { 或 }。
  • 不支援空字元類 [] 。 若要在字元類中包含右方括弧,請轉義它。

與 \p{} 支援的 \P{}Unicode 字元類別:

  • 字母: L, Lu,,, Ll, Lt, LmLo
  • 標誌: M,, Mn, McMe
  • 數位: N, Nd,, NlNo
  • 標點符號: P,,,, PcPdPsPePiPfPo
  • 符號: S, Sm,, Sc, SkSo
  • 分隔符: Z, Zs,, ZlZp
  • Control 和 Format: Cc, Cf,而不支援其他 C 前綴類別。

\W, \D, \S, \P{} 並且不能在否定字元類 [^...]中使用。 為了在某些平臺上實現,這些負字元類被轉換為其 Unicode 等效項,如果也被否定,這可能很難做到。

字元類不支援 U+10000 和 U+10FFFF 之間的 Unicode 字元 (需要代理對)。

量詞

特點 Description
貪婪零或一 ? 匹配 0 次或 1 次, 匹配量盡可能大 。
貪婪零或更多 * 匹配 0 次或多次, 匹配盡可能大 。
貪婪一個或多個 + 匹配一次或多次, 匹配盡可能大 。
貪婪至少 n {n,} 至少匹配 n 次, 匹配盡可能大 。 例如, a{3,} 匹配中的所有 aaaaa字元。
N 和 m 之間的貪婪 {n,m} n 次和 m 次之間的 匹配, 匹配量盡可能大 。 例如, a{1,3} 匹配的 aaaaa前三個字元。
懶惰零或一 ?? 匹配 0 次或 1 次, 匹配量盡可能小 。
惰性零或更多 *? 匹配 0 次或多次, 匹配量盡可能小 。
惰性一個或多個 +? 匹配一次或多次, 匹配盡可能小 。
懶惰至少 n {n,}? 至少匹配 n 次, 匹配盡可能小 。 例如, a{3,}? 僅匹配中的 aaaaa前三個字元。
N 和 m 之間的惰性 {n,m}? n 次和 m 次之間的 匹配, 匹配盡可能小 。 例如, a{1,3}? 僅匹配的 aaaaa第一個字元。
精確 n {n} 匹配 n 次,準確。 例如, a{3} 恰好匹配的 aaaaa三個字元。

不支援所有格量詞。

混合子匹配和量詞有局限性。 有關詳細資訊,請參閱 可能為空的子匹配項。

群組

特點 Description
群組 ( 並 ) 用於對要應用的量詞的元素進行分組。 例如, (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)。

兩個捕獲組不能共用相同的名稱,例如,不支援正則表達式 (?<id>\w+)|(?<id>\d+) 。

命名子匹配項的名稱必須以字元開 \p{L} 頭,或者 _,並且可以繼續使用這些字元加號 \p{Nd}。 名稱的長度限制為 62 個 UTF-16 代碼單位。

也不支援對可能為空的子匹配項以及向後看或向前看中的子匹配項的反向引用。

一些實現提供了一個「顯式捕獲」選項來提高性能,這是不必要的 Power Fx ,因為它是預設的。 MatchOptions.NumberedSubMatches 禁用它並啟用隱式編號的捕獲。

混合子匹配和量詞有局限性。 有關更多資訊,請參閱 可能為空子匹配項 。

意見

特點 Description
內聯註釋 (?# comment here),將其作為註釋忽略。 註釋以下一個右括號結尾,即使註釋中有左括弧。

有關格式化和註釋正則表達式的替代方法,請參閱 MatchOptions.FreeSpacing 。

內聯選項

特點 Description
內聯選項 (?im) 與使用 MatchOptions.IgnoreCase 和 MatchOptions.Multiline 相同。 必須在正則表達式的開頭設置。

支援的內聯模式是 [imsx]。 這些分別對應 於 MatchOptions.IgnoreCase、 MatchOptions.Multiline、 MatchOptions.DotAll 和 MatchOptions.FreeSpacing。 n 也接受相容性,但無效,因為它是預設值,並且與 MatchOptions.NumberedSubMatches 不相容。

內聯選項不能用於禁用選項或設置子表達式的選項。

選項

匹配選項更改正則表示式匹配的行為。 有兩種方法可以啟用選項,只要沒有衝突,就可以混合使用:

  • MatchOptions 枚舉值作為第三個參數傳遞給 Match、 MatchAll 和 IsMatch。 例如 & ,選項可以與 Concatenate 運算符或 MatchOptions.DotAll & MatchOptions.FreeSpacing函數組合使用。 所有正則表達式函數都要求 MatchOptions 是常量值,不能計算或存儲在變數中。
  • (?...) 正則表達式開頭的前綴。 例如 (?...) ,選項可以與構造中的 (?sx)多個字母組合。 某些選項沒有等效項 (?...) ,但可能有其他方法來獲得相同的效果,例如 MatchOptions.BeginsWith 等效 ^ 於正則表達式開頭的。

包含

使用 MatchOptions.Contains 啟用 ,沒有等效的正則表達式文本。 MatchOptions.Contains 是外部 Power Apps所有函數的預設值;MatchOptions.Complete Power Apps 內 是 IsMatch 的預設值。

完成

分別在正則表達式的開頭和開頭使用 MatchOptions.Complete 或使用 and ^ 啟用 $ 。

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。
  • # 開始一個註釋,一直持續到行尾。 它和跟隨下一個換行符的所有字元 (沒有 MatchOptions.DotAll . 的 字元) 都將被忽略。
  • 這些更改中不包括字元類。 空間角色並 # 像往常一樣行事。 例如, 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

忽略大小寫

使用 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 中。 在匹配系統資源的第二個示例中,它很有用,例如, tr-TR 區域性 I 不是大寫等效項 i。

如果需要區分大小寫的區域性感知匹配,請改用帶有匹配字元的字元類,例如 [Hh][Ee][Ll][Ll][Oo] 對於第一個示例。

多行

使用 MatchOptions.Multiline 或(?m) 在正則表達式的開頭啟用。

通常, ^ 錨 $ 點與輸入文本的開頭和開頭匹配。 使用“多行” 修飾符時,這些錨點將匹配輸入文本中行的開頭和結尾,其中每行以輸入的,\r,或結尾結 \n\r\n尾。 例如:

MatchAll( "Hello" & Char(13) & Char(10) & "World", "^.+$" )
// returns 
// "Hello"

預先定義的型態

預訂模式允許您匹配一組字元中的一個或多個字元的序列。 使用 string-concatenation 運算符 & 將 文本字串與 Match 枚舉的 成員組合在一起:

Match 列舉 Description 規則運算式
任何 相配任何字元。 .
逗點 匹配逗號 ,。 ,
數位 匹配個位數 (0 通過 9 和其他成員 \p{Nd})。 \d
Email 匹配包含「at」符號 (@) 的電子郵件位址和包含至少一個點(). 的功能變數名稱,由空格和標點符號分隔。 見註釋
連字型大小 相配連字號。 - 見註釋
左帕倫 匹配左括弧 (。 \(
信 相配字母。 \p{L}
多位數 相配一或多位數。 \d+
多個字母 相配一或多個字母。 \p{L}+
MultipleNonSpaces 相配一或多個不會新增空白字元 (非空白、定位、或新行) 的字元。 \S+
多空間 相配一或多個會新增空白字元 (空格、定位、或新行) 的字元。 \s+
非空間 相配不會新增空白字元的單一字元。 \S
可選數位 相配零、一或多位數。 \d*
可選字母 相配零、一或多字母。 \p{L}*
可選非空格 相配零、一或多個不會新增空白字元的字元。 \S*
可選空間 相配零、一或多個會新增空白字元的字元。 \s*
Period 匹配句點或點 .。 \.
右帕倫 與右括弧 )匹配。 \)
空間 相配會新增空白字元的字元。 \s
定位字元 比對 Tab 字元。 \t

例如,模式 “A”和 Match.MultipleDigits 匹配字母“A”,後跟一個或多個數位。

Match.Email 模式比其他模式更複雜。 它可以檢測並提取表單 local@hostname.tld中的常見電子郵件位址,可能來自長文本段落,並支持國際字元和表情符號。 使用它來驗證將電子郵件地址作為輸入的表單,作為快速測試輸入是否在電子郵件表單中。 如果不提取,請使用 MatchOptions.Complete 檢測 電子郵件位址,例如,在文本輸入控件中。

但是, Match.Email 不會驗證電子郵件位址是否符合電子郵件位址、功能變數名稱和頂級域的許多不斷發展的標準,這些標準需要一個複雜的正則表達式,需要不時更新。 儘管大多數電子郵件位址都按預期進行處理, 但 Match.Email 與某些無效情況 (例如主機名中的下劃線) 匹配,並且與某些有效情況 (例如帶引號的電子郵件位址或 IP 位址) 不匹配。 如果需要,網路上有許多正則表示式用於檢測真正合法的電子郵件位址。 在生產中使用之前,請務必根據您的特定需求測試正則表達式。

如果要查看使用的正則表示式,請評估公式 Text( Match.Email )。 第一部分匹配之前 @ 的字元,並根據 RFC 822 和 修訂 版排除常見的 ASCII 標點符號以及 Unicode 開頭和結束標點符號,以便於提取,例如 (、[、“、« 和 「。 它不支援不常見且不鼓勵使用帶引號的字串或註釋。 在之後 @,正則表達式的第二部分和第三部分相同,並用 a . 分隔,確保地址中始終至少 . 有一個。 這些部分不包括除、和 .- 之外的所有 _ Unicode 標點符號。 不支援 IP 位址。 在整個電子郵件位址中,支援國際字元和表情符號。

在不 Power Apps使用 Power Fx 1.0 時, Match.Email 和 Match.Hyphen 的定義略有不同。 Match.Email 更簡單,但不適合提取電子郵件地址,因為它會捕獲空格。 以前, Match.Hyphen 是在字元類之外轉義的,現在是非法的。

編號子匹配項

使用 MatchOptions.NumberedSubMatches 啟用 ,沒有內聯選項。 (?n) 支援與此選項相反的相容性,並且是預設值。

默認情況下, (...) 不捕獲,相當於大多數系統所說的「顯式捕獲」。。要捕獲,請使用帶有反向引用 (?<name>...) 的 \k<name>命名捕獲。 使用命名捕獲可以不捕獲不需要的組,通過使用名稱提高清晰度,並且在捕獲位置發生變化時不易出錯,從而提高性能。

如果您已有正則表達式,則可能取決於自動捕獲和編號的組,包括編號的反向引用。 通過使用 MatchOptions.NumberedSubMatches 選項,可以使用此行為。

命名和編號的子匹配不能一起使用。 由於某些實現以不同的方式處理編號和命名捕獲組的混合, Power Fx 因此不允許這樣做。

可能是空的子匹配項

如簡介所述, Power Fx的正則表達式有意限制為可以在 .NET、JavaScript 和其他程式設計語言正則表達式引擎上一致實現的功能。 創作時錯誤會阻止使用不屬於此集的功能。

實現之間可能不同的一個領域是如何處理空子匹配。 例如,考慮要求匹配文本 (?<submatch>a*)+ 的正則表達式 a。 在 .NET 上,子匹配項會產生空文本字串,而在 JavaScript 上,子匹配項會產生 a空文本字串。 兩者都可以被認為是正確的實現,因為 + 量詞可以用空字串來滿足,因為組的內容有一個 * 量詞。

為避免實現之間的 Power Fx 結果不同,可能為空的子匹配項不能與量詞一起使用。 以下是子匹配如何為空的範例:

範例 Description
(?<submatch>a{0,}b*)+ 子匹配的所有內容都是可選的,因此整個子匹配可能是空的。
((<submatch>a)?b)+ 由於子匹配項外部, ? 子匹配項整體是可選的。
(?<submatch>a|b*)+ 在子匹配中與可能為空的內容交替可能會導致整個子匹配為空。
((?<submatch>a)|b)+ 子匹配項之外的交替可以匹配 b ,在這種情況下,子匹配項將為空。

中的 (?<submatch>a+)+ 子匹配不能為空,因為子匹配中必須至少有一個 a 子匹配,並且受支援。

Unicode

Power Fx 正則表達式使用 Unicode 類別來定義 \w 和 \d, \s並具有 \p{..}特定類別。

這些定義可能因平台而異。 例如,Unicode 標準會不時更新新字元,稍後將由平臺按照自己的節奏實現。 在所有平臺更新之前,預計不同平台的結果會有所不同。

Power Fx 正則表達式確保類別信息始終可用於基本多語言平面 (字元 U+0 到 U+ffff)。 某些平臺不會為補充多語言平面及以後的字元 (U+10000 到 U+10ffff) 實現類別。 此限制通常不是問題,因為基本多語言平面中的字元是最常用的。 如果方案涉及 U+10000 或超過 U+10000 的字元,請直接使用字元值而不是類別。 在您打算使用的平台上測試您的正則表達式。

平台之間可能存在微小的邊緣情況差異。 例如,某些平臺在調用 MatchOptions.IgnoreCase ſ 時 s 可能不會被視為 匹配 。 如果這些字元對方案很重要,請使用字元類 like [ſsS] 不區分大小寫進行匹配,並顯式包含所需的字元。