IsMatch、 Match和 MatchAll 函数

适用于: 画布应用 Copilot Studio 模型驱动应用 Power Platform CLI Dataverse 函数 Power Pages

根据模式测试匹配或提取文本字符串的各个部分。

描述

IsMatch 函数测试文本字符串是否匹配可构成普通字符、预定义模式或 正则表达式的模式。 MatchMatchAll函数返回匹配的内容,包括子匹配项。

用于 IsMatch 验证用户在 文本输入 控件中键入的内容。 例如,在结果保存到数据源之前,请确认用户是否输入了有效的电子邮件地址。 如果条目与条件不匹配,请添加其他控件,提示用户修复该条目。

用于 Match 提取与模式匹配的第一个文本字符串,以及 MatchAll 提取匹配的所有文本字符串。 提取子匹配项以分析复杂字符串。

Match 返回找到的第一个匹配项的信息记录,并 MatchAll 返回找到的每个匹配项的记录表。 记录包含:

Column 类型 描述
命名的 Sub-Match 或 Sub-Matches 文本 每个命名子匹配都有其自己的列。 使用 (?<名字>... 正则表达式中。 如果命名子匹配的名称与其中一个预定义列同名,则子匹配优先,并生成警告。 重命名子匹配项以避免出现此警告。
FullMatch 全面匹配 文本 匹配的所有文本字符串。
StartMatch 开始 号码 匹配项在输入文本字符串中的开始位置。 字符串的第一个字符返回 1。
SubMatches,仅当使用 MatchOptions.NumberedSubMatches 时。 单列文本表(Value 列) 按正则表达式中显示的顺序排列的编号子体表。 通常,命名子体更易于使用,并且受到鼓励。 使用 ForAll 函数或 索引 函数处理单个子匹配。 如果未在正则表达式中定义子匹配项,则此表将存在但为空。

这些函数支持 MatchOptions。 默认情况下:

  • 这些函数执行区分大小写的匹配。 使用 MatchOptions.IgnoreCase 执行不区分大小写的匹配。
  • IsMatch匹配整个文本字符串(Complete MatchOption),同时MatchMatchAll搜索文本字符串(包含 MatchOption)中的任意位置匹配项。 请根据您的情况使用 CompleteContainsBeginsWithEndsWith

IsMatch 如果文本字符串与模式匹配,则返回 true ;否则返回 falseMatch如果未找到可使用 IsBlank 函数测试的匹配项,则返回MatchAll 如果未找到可以使用 IsEmpty 函数测试的匹配项,则返回空表。

如果使用 MatchAll 拆分文本字符串,请考虑使用 Split 函数,该函数更简单、更快。

模式

使用这些函数的关键在于描述要匹配的模式。 您可以组合使用以下文本字符串来描述模式:

  • 普通字符,如 "abc""123"
  • 预定义模式,如 LetterMultipleDigitsEmailMatch(枚举定义这些模式。
  • 正则表达式代码,如 "\d+\s+\d+""[a-z]+"

使用 字符串串联运算符 合并这些元素。 例如,"abc" & Digit & "\s+" 是一个有效的模式,它表示首先要与字符“a”、“b”和“c”匹配,后面跟一个从 0 到 9 的数字,后面再跟至少一个空格字符。

普通字符

最简单的模式是一系列完全匹配的普通字符。

例如,与函数一起使用 IsMatch 时,字符串“Hello”与模式 “Hello” 完全匹配。 不多不少,正好相符。 字符串 "hello!" 与模式不匹配,因为末尾的感叹号和字母“h”的情况不正确。 (请参阅Match修改此行为的方法的选项。

在模式语言中,字符 . ? * + ( ) [ ] ^ $ | \ 保留为特殊用途。 若要使用这些字符,请为字符添加前缀 \ (反斜杠),以指示应从字面上获取该字符,或使用预定义模式之一。 例如,可以在问号前将模式"Hello?"与反斜杠一起使用来匹配字符串"Hello\\?"

预定义模式

预定义模式提供了一种简单方法来匹配一组字符中的一个字符或一个多字符序列。 使用 字符串串联运算符 并将 自己的文本字符串与枚举的成员 Match 组合在一起:

Match 枚举 描述 正则表达式
任何 匹配任何字符。 .
逗点 匹配逗号 , ,
数字 匹配单个数字(“0”到“9”)。 \d
Email 匹配包含“at”符号(“@”)和包含点(“.”)的域名的电子邮件地址 请参阅注释
连字号 匹配连字符。 - 请参阅注释
左帕伦 匹配左括号 ( \(
匹配一个字母。 \p{L}
多位数 匹配一个或多个数字。 \d+
多字母 匹配一个或多个字母。 \p{L}+
MultipleNonSpaces 匹配不包含空白(不是空格、制表符或换行符)的一个或多个字符。 \S+
多空间 匹配可间断(包含空格、制表符或换行符)的一个或多个字符。 \s+
非空格 匹配不包含空白的单个字符。 \S
OptionalDigits 配零个、一个或多个数字。 \d*
可选信件 匹配零个、一个或多个字母。 \p{L}*
OptionalNonSpaces 匹配不包含空白的零个、一个或多个字符。 \S*
OptionalSpaces 匹配包含空白的零个、一个或多个字符。 \s*
时期 匹配句点或点 . \.
右帕伦 与右括号 )匹配。 \)
空间 匹配包含空白的字符。 \s
标签 匹配制表符。 \t

例如,模式 “A”和 MultipleDigits 与字母“A”匹配,后跟一个或多个数字。

Power Apps 使用不同的定义。MatchEMailMatch.连字符。 计算 Text( Match.Email ) 结果以查看主机使用的正则表达式。

正则表达式

这些函数使用的模式称为 正则表达式。 Power Fx 的特定正则表达式方言在 Power Fx 中的正则表达式中详细介绍。

正则表达式功能强大,用途多种多样。 它们还可以看起来像随机标点符号序列。 本文没有描述正则表达式的所有方面,但在线提供了 wealth 的信息、教程和工具。

正则表达式有着悠久的历史,并且有多种编程语言版本。 每种编程语言都有自己的正则表达式方言,而且标准很少。 我们努力确保所有 Power Fx 实现都使用相同的正则表达式。 兼容性并不容易实现,因为 Power Fx 在 JavaScript 和 .NET 之上运行,它们有显着差异。 为了适应在不同平台上的运行,Power Fx 正则表达式仅限于整个行业广受支持的功能子集。

因此,某些可在其他环境中工作的正则表达式可能会被阻止,或者需要在 Power Fx 中进行调整。 当遇到不受支持的功能时,将报告创作时间错误。 这是正则表达式和选项必须是创作时间常量而不是动态(例如,在变量中提供)的原因之一。

注释

Power Apps 使用早期版本的 Power Fx 正则表达式,这些表达式的限制更少,但功能也更少。 MatchOptions.DotAllMatchOptions.FreeSpacing 不可用,其定义如下Match。电子邮件Match.连字符不同。 Unicode 代理对不被视为单个字符。 MatchOptions.NumberedSubMatches 是默认值。 此处所述的正则表达式版本将在 Power Apps 中很快在“Power Fx V1.0 兼容性”开关下提供。

以下是正则表达式的一些基本元素,这些元素在分析数字时会建立复杂性。

功能 / 特点 Example 描述
Predfined 字符类 \d 此正则表达式匹配单个数字,例如 1。 字符类匹配一组字符,并将\d标准数字09与 Unicode 字符类别“Nd”中定义的数字相匹配。 有字母和数字 \w 的字符类以及空格,包括换行符 \s。 此外,还有大写的反字符类: \D 匹配所有没有的 \d 字符类。
一个或多个 \d+ 此正则表达式匹配一个或多个数字,例如 123。 元素 + 后面显示最后一个元素的“一个或多个”。
零个或一个 \+?\d 此正则表达式与一个可选 + 符号匹配,后跟一个或多个数字,例如 +123 ,以及只是 123。 元素 ? 后显示“这是可选的,它可能发生零次或一次”。 在 + 将其区分为文本字符而不是“一个或多个”用法之前,它具有反斜杠。
分组和交替 (-|\+)?\d+ 此正则表达式与符号 +-符号(可选)匹配,然后匹配一系列数字,例如 -123+123123。 我们在这里引入了两个经常一起使用的概念。 首先,我们将括号组合为一组元素,以便 ? 对其执行作。 其次,我们有 | 说“要么这样,要么这样”。
自定义字符类 (-|\+)?\d+[eE][\-\+]?\d+ 此正则表达式向混合添加一个指数,其中包含两个字符类,匹配 +123e-12。 字符类类似于 | 交替,以更紧凑的形式提供“匹配其中一项”。 与上述 +一样, - 在正则表达式字符类中具有特殊含义,因此我们需要对其进行转义。
零个或多个 (-|\+)?\d+\.?\d*[eE][\-\+]?\d+ 此正则表达式在数字的整数部分之后添加小数,例如 -123.456e-89-123.E+32。 小 \d 数点后有一个 * 限定符,表示在小数点之后的小数位数为“零次或更多次” .
捕获组 (?&lt;number&gt;(-|\+)?\d+\.?\d*)[eE](?&lt;exponent&gt;[\-\+]?\d+) 最后,我们添加用于 number 和的 exponent捕获组。 正则表达式不仅可以匹配整个字符串,还可以提取部分以用于公式,在本例 中为 /> 和之后的部分。

这些示例只提供正则表达式可以执行的作的一小部分。 它们通常用于验证 ID 号码、电子邮件地址、电话号码、日期和时间,以及从所有类型的文本文件中提取信息。 通过阅读 Power Fx 中的正则表达式、试验和使用 Web 了解详细信息,继续你的旅程。

Match 选项

通过指定一个或多个使用字符串串联运算符(>)组合的选项来修改这些函数的行为。

MatchOptions 枚举 描述 对正则表达式的影响
MatchOptions.BeginsWith 模式必须与文本的开头匹配。 在正则表达式的开头添加 ^
MatchOptions.Complete Power IsMatch Apps 的默认值。 该模式匹配整个文本字符串,从头到尾。 在正则表达式的开头添加 ^,并且在末尾添加 $
MatchOptions.Contains Power Apps 和 MatchMatchAllIsMatch Power Apps 外部的默认值。 模式必须出现在文本中,但不必与开头或结尾匹配。 不修改正则表达式。
MatchOptions.DotAll 更改 (dot) 运算符的行为 . 以匹配所有字符,包括换行符。 Power Apps 中不可用。 不修改正则表达式。 此选项等效于正则表达式的标准“s”修饰符。
MatchOptions.EndsWith 模式必须与文本字符串的末尾匹配。 在正则表达式的末尾添加 $
MatchOptions.FreeSpacing 正则表达式中忽略空格字符(包括换行符)。 以 a # 开头的行尾注释将被忽略。 Power Apps 中不可用。 仅更改正则表达式语法的方式。 此选项等效于正则表达式的标准“x”修饰符。
MatchOptions.IgnoreCase 将大写和小写字母视为相同。 默认情况下,匹配时区分大小写。 不修改正则表达式。 此选项等效于正则表达式的标准“i”修饰符。
MatchOptions.多行 更改行尾的行为 ^$ 与之匹配。 不修改正则表达式。 此选项等效于正则表达式的标准“m”修饰符。
MatchOptions.NumberedSubMatches 首选命名捕获,因为它们更易于理解和维护。 性能也会提高,因为不需要的捕获不会保留。 但是,对于较旧的正则表达式,将每个括号视为结果中 子Matches 表附带的带编号捕获。 Power Apps 中的默认值。 不修改正则表达式。 已禁用命名捕获并 \1 启用样式后引用。

使用 MatchAll 与对正则表达式使用标准“g”修饰符相同。

语法

IsMatch文本模式 [、 选项 ] )

  • Text –必需。 要测试的文本字符串。
  • pattern –必需。 要作为文本字符串测试的模式。 连接枚举定义或提供正则表达式的预定义模式 Match模式 必须是没有变量、数据源或其他动态引用的常量公式,在应用运行时更改。 请注意,公式必须表示为“Match。PredefinedPattern“,例如 Match。电子邮件
  • Options(选项) –可选。 MatchOptions 枚举值的文本字符串组合。 默认情况下,使用 MatchOptions.Complete选项 必须是不带变量、数据源或其他动态引用的常量公式,在应用运行时更改。

Match文本模式 [、 选项 ] )

  • Text –必需。 要匹配的文本字符串。
  • pattern –必需。 要作为文本字符串匹配的模式。 连接枚举定义的预定义模式 Match ,或提供正则表达式。 Pattern 必须是一个常量公式,不包含任何变量、数据源或其他随着应用程序运行而变化的动态引用。
  • Options(选项) –可选。 MatchOptions 枚举值的文本字符串组合。 默认情况下,使用 MatchOptions.Contains选项 必须是一个常量公式,没有任何变量、数据源或其他动态引用在应用运行时发生更改。

MatchAll文本模式 [、 选项 ] )

  • Text –必需。 要匹配的文本字符串。
  • pattern –必需。 要作为文本字符串匹配的模式。 连接枚举定义或提供正则表达式的预定义模式 Match模式 必须是没有变量、数据源或其他动态引用的常量公式,在应用运行时更改。
  • Options(选项) –可选。 MatchOptions 枚举值的文本字符串组合。 默认情况下,使用 MatchOptions.Contains选项 必须是不带变量、数据源或其他动态引用的常量公式,在应用运行时更改。

IsMatch 例子

普通字符

假设你的应用有一个名为 TextInput1的文本输入控件。 用户在此控件中输入值以将它们存储在数据库中。

用户在 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", Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit & Match.Digit ) 匹配美国社会安全号码
IsMatch( "joan@contoso.com", Match.Email ) 匹配电子邮件地址
IsMatch( "123.456", Match.MultipleDigits & Match.Period & Match.OptionalDigits ) 匹配一个数字序列,后跟一个句点,后面再跟零个或多个数字。
IsMatch( "123", Match.MultipleDigits & Match.Period & Match.OptionalDigits ) 匹配一个数字序列,后跟一个句点,后面再跟零个或多个数字。 文本中没有匹配的句点,因此该模式不匹配。

正则表达式

公式 描述 结果
IsMatch( "986", "\d+" ) 匹配大于零的整数。
IsMatch( "1.02", "\d+(\.\d\d)?" ) 匹配正货币金额。 如果输入的内容包含小数点,则小数点后还要有两个数字字符。 例如,3.00 有效,但 3.1 无效。
IsMatch( "-4.95", "(-)?\d+(\.\d\d)?" ) 匹配正或负货币金额。 如果输入的内容包含小数点,则小数点后还要有两个数字字符。
IsMatch( "111-11-1111", "\d{3}-\d{2}-\d{4}" ) 匹配美国社会安全号码。 验证提供的输入字段的格式、类型和长度。 要匹配的字符串必须包含三个数字字符,后跟一个短划线,再跟两个数字字符,再跟一个短划线,最后跟四个数字字符。
IsMatch( "111-111-111", "\d{3}-\d{2}-\d{4}" ) 与上例相同,但其中一个连字符的位置不对。
IsMatch( "AStrongPasswordNot", "(?!^[0-9]\*$)(?!^[a-zA-Z]\*$)([a-zA-Z0-9]{8,10})" ) 验证必须包含 8、9 或 10 个字符、至少 1 位数字和至少一个字母字符的强密码。 字符串不能包含特殊字符。

Match 和 MatchAll 示例

公式 描述 结果
Match( "Bob Jones <bob.jones@contoso.com>", "<(?<email>" & Match.Email & ")>") 仅提取联系信息的电子邮件部分。 {
电子邮件:“”bob.jones@contoso.com,
FullMatch: “<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 函数文档(?: 运算符将字符分组,而不创建另一个子匹配项。 {
语言:“en”,
script: blank,
区域:“US”,
FullMatch:“en-US”,
StartMatch:1
}
Match( "PT2H1M39S", "PT(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ) 从 ISO 8601 持续时间值中提取小时、分钟和秒。 提取的数字仍在文本字符串中;使用 Value 函数将文本字符串转换为数字,然后再对其执行数学运算。 {
小时:“2”,
分钟:“1”,
seconds: “39”,
FullMatch:“PT2H1M39S”,
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 ) pangram 变量包含的文本字符串中查找“THE”的所有匹配项。 字符串包含两个匹配项,但只返回第一个匹配项,因为你正在使用而不是 MatchAllMatch {
FullMatch:“The”,
StartMatch:32
}
MatchAll( pangram, "the" ) pangram 变量包含的文本字符串中找到“the”的所有匹配项。 此测试区分大小写,因此仅找到“the”的第二个实例。 MatchAll for pangram。
MatchAll( pangram, "the", IgnoreCase ) pangram 变量包含的文本字符串中找到“the”的所有匹配项。 在此例中,测试不区分大小写,因此找到了该单词的全部两个实例。 MatchAll with IgnoreCase。
MatchAll( pangram, "\b\wo\w\b" ) 查找所有三个字母的单词,中间带有“o”。 “brown”被排除,因为它不是三个字母单词,因此,无法匹配“\b”(字边界)。 MatchAll 用于具有 b、wo、w 和 b 的平格拉姆。
Match( pangram, "\b\wo\w\b\s\*(?<between>\w.+\w)\s\*\b\wo\w\b" ) 匹配“fox”和“dog”之间的所有字符。 {
between: “跳过懒惰”,
FullMatch:“狐狸跳过懒狗”,
StartMatch:17
}

若要查看库中的结果 MatchAll

  1. 在空屏幕中,插入空白的垂直 控件。

  2. 将库的 Items 属性设置为MatchAll(pangram、“\w+”)MatchAll(pangram、MultipleLetters)。

    项库。

  3. 在 Gallery 控件的中间选择“从‘插入’选项卡添加项”,以选择库的模板。

  4. Label 控件添加到库的模板中。

  5. 将标签的 Text 属性设置为 ThisItem.FullMatch

    库已填充了我们的示例文本中的每个单词。 若要查看一个屏幕上的所有字词,请调整库的模板和标签控件的大小。

    Text 属性。