isMacth函数C语言括号匹配,IsMatch、Match 和 MatchAll 函数 - Power Apps | Microsoft Docs

Power Apps 中的 IsMatch、Match 和 MatchAll 函数

02/07/2020

本文内容

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

描述

IsMatch 函数用于测试文本字符串是否与包含普通字符、预定义模式或正则表达式的某种模式相符。 Match 和 MatchAll 函数返回匹配的内容,包括子匹配项。

使用 IsMatch 函数可验证用户在

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

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

Type

描述

命名子‑匹配项或子‑匹配项

文本

每个命名子匹配都将有自己的列。 通过在正则表达式中使用 (?...) 创建命名子匹配项。 如果命名子匹配项与预定义列(下方)之一具有相同名称,子匹配项优先,并生成警告。 若要避免此警告,请重命名子匹配项。

FullMatch

文本

匹配的所有文本字符串。

StartMatch

号码

匹配项在输入文本字符串中的开始位置。 字符串的第一个字符返回 1。

SubMatches

单列文本表(Value 列)

命名和未命名子匹配项的表按它们在正则表达式中出现的顺序排列。 通常,命名子匹配项更易于使用,建议使用。 使用 ForAll 函数或 Last( FirstN( ... ) ) 函数可以处理单独的子匹配项。 如果在正则表达式中未定义任何子匹配项,此表将存在但为空。

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

这些函数执行区分大小写的匹配。 使用 IgnoreCase 可执行不区分大小写的匹配。

IsMatch 匹配整个文本字符串 (Complete MatchOption),而 Match 和 MatchAll 在文本字符串中的任意位置搜索匹配项 (Contains MatchOption)。 请根据您的情况使用 Complete、Contains、BeginsWith 或 EndsWith。

如果文本字符串与模式相符,则 IsMatch 函数返回 true;否则,返回 false。 如果没有找到可以使用 IsBlank 函数测试的匹配项,Match 将返回 blank。 如果没有找到可以使用 IsEmpty 函数测试的匹配项,MatchAll 将返回一个空表。

如果您使用 MatchAll 拆分文本字符串,请考虑使用

模式

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

普通字符,如 "abc" 或 "123"。

预定义模式,如 Letter、MultipleDigits 或 Email。 (Match 枚举定义了这些模式。)

正则表达式代码,如 "\d+\s+\d+" 或 "[a-z]+"。

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

普通字符

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

例如,当与 IsMatch 函数一起使用时,字符串“Hello”与模式 "Hello" 完全匹配。 不多不少,正好相符。 字符串“hello!” 就与这个模式不匹配,因为它的末尾有一个感叹号,并且字母“h”的大小写错误。 (有关修改这种行为的方法,请参阅 MatchOptions。)

模式语言中有一些保留字符,这些字符有特殊的用途。 要使用这些字符,请使用 \(反斜杠)作为前缀,这表示应将后面的字符当作普通字符,您也可以使用此主题后面介绍的预定义模式之一。 下表列出了这些特殊字符:

特殊字符

描述

.

圆点或句点

?

问号

*****

星号

+

( )

括号

[ ]

方括号

{}

大括号

^

插入符号

$

美元符号

|

竖线

\

反斜杠

例如,可以 使用在问号前加一个反斜杠的模式 "Hello\?" 来匹配“Hello?”。

预定义模式

预定义模式提供了一种简单方法来匹配一组字符中的一个字符或一个多字符序列。 使用 字符串连接运算符 & 可将您自己的文本字符串与 Match 枚举中的模式进行组合:

Match 枚举

描述

正则表达式

任何

匹配任何字符。

.

逗号

匹配逗号。

,

Digit

匹配单个数字(“0”到“9”)。

\d

Email

匹配包含(“@”)符号和包含点(“.”)的域名的电子邮件地址

.+\@.+\\.[^\\.]{2,}

Hyphen

匹配连字符。

\-

LeftParen

匹配左圆括号“(”。

\(

信件

匹配一个字母。

\p{L}

MultipleDigits

匹配一个或多个数字。

\d+

MultipleLetters

匹配一个或多个字母。

\p{L}+

MultipleNonSpaces

匹配不包含空白(不是空格、制表符或换行符)的一个或多个字符。

\S+

MultipleSpaces

匹配可间断(包含空格、制表符或换行符)的一个或多个字符。

\s+

NonSpace

匹配不包含空白的单个字符。

\S

OptionalDigits

配零个、一个或多个数字。

\d*

OptionalLetters

匹配零个、一个或多个字母。

\p{L}*

OptionalNonSpaces

匹配不包含空白的零个、一个或多个字符。

\S*

OptionalSpaces

匹配包含空白的零个、一个或多个字符。

\s*

周期

匹配句点或圆点(“.”)。

\.

RightParen

匹配右圆括号“)”。

\)

空格

匹配包含空白的字符。

\s

选项卡

匹配制表符。

\t

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

正则表达式

这些函数使用的模式是正则表达式。 此主题前面介绍的普通字符和预定义模式可以帮助您构建正则表达式。

正则表达式的功能非常强大,许多编程语言中都有提供,并且用途广泛。 它们通常可能看上去像是随机的标点符号序列。 本文没有详细介绍正则表达式的每个方面,不过网络上有大量的信息、教程和工具可用。

正则表达式有不同的方言,Power Apps 使用 JavaScript 方言的一种变体。 有关语法的介绍,请参阅正则表达式语法。 支持命名子匹配项(有时称为命名捕获组):

名子匹配项:(? ...)

命名反向引用:\k

在此主题前面的 Match 枚举表中,每个枚举与其对应的正则表达式出现在同一行中。

匹配选项

您可以通过指定一个或多个选项(可使用字符串连接运算符 (&) 进行组合)修改这些函数的行为。

MatchOptions 枚举

描述

对正则表达式的影响

BeginsWith

模式必须与文本的开头匹配。

在正则表达式的开头添加 ^。

完成

IsMatch 的默认值。 模式必须与整个文本字符串从头到尾完全匹配。

在正则表达式的开头添加 ^,并且在末尾添加 $。

包含

Match 和 MatchAll 的默认值。 模式必须出现在文本中,但不必与开头或结尾匹配。

不修改正则表达式。

EndsWith

模式必须与文本字符串的末尾匹配。

在正则表达式的末尾添加 $。

IgnoreCase

将大写和小写字母视为相同。 默认情况下,匹配时区分大小写。

不修改正则表达式。 此选项等效于正则表达式的标准“i”修饰符。

多行

匹配多行。

不修改正则表达式。 此选项等效于正则表达式的标准“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.Contains。

MatchAll( Text, Pattern [, Options ] )

Text – 必需。 要匹配的文本字符串。

Pattern – 必需。 要作为文本字符串匹配的模式。 连接 Match 枚举定义的预定义模式或提供正则表达式。 Pattern 必须是一个常数公式,且没有任何变量、数据源或其他随应用运行而变化的动态引用。

Options – 可选。 MatchOptions 枚举值的文本字符串组合。 默认情况下,使用 MatchOptions.Contains。

IsMatch 示例

普通字符

假设应用包含一个名为 TextInput1 的 文本输入 控件。 用户在这个控件中输入的值存储在数据库中。

用户在 TextInput1 中输入 Hello 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 )

匹配一个数字序列,后跟一个句点,后面再跟零个或多个数字。

true

IsMatch( "123", MultipleDigits & Period & OptionalDigits )

匹配一个数字序列,后跟一个句点,后面再跟零个或多个数字。 文本中没有匹配的句点,因此该模式不匹配。

false

正则表达式

公式

描述

结果

IsMatch( "986", "\d+" )

匹配大于零的整数。

true

IsMatch( "1.02", "\d+(\.\d\d)?" )

匹配正货币金额。 如果输入的内容包含小数点,则小数点后还要有两个数字字符。 例如,3.00 有效,但 3.1 无效。

true

IsMatch( "-4.95", "(-)?\d+(\.\d\d)?" )

匹配正或负货币金额。 如果输入的内容包含小数点,则小数点后还要有两个数字字符。

true

IsMatch( "111-11-1111", "\d{3}-\d{2}-\d{4}" )

匹配美国社会安全号码。 验证提供的输入字段的格式、类型和长度。 要匹配的字符串必须包含三个数字字符,后跟一个短划线,再跟两个数字字符,再跟一个短划线,最后跟四个数字字符。

true

IsMatch( "111-111-111", "\d{3}-\d{2}-\d{4}" )

与上例相同,但其中一个连字符的位置不对。

false

IsMatch( "AStrongPasswordNot", "(?!^[0-9]\*$)(?!^[a-zA-Z]\*$)([a-zA-Z0-9]{8,10})" )

验证强密码,除包含至少一个数字和至少一个字母字符外,还必须包含 8、9 或 10 个字符。 字符串不能包含特殊字符。

false

Match 和 MatchAll 示例

公式

描述

结果

Match( "Bob Jones ", "" & Match.Email & ")>"

仅提取联系信息的电子邮件部分。

{

email: "bob.jones@contoso.com",

FullMatch: "",

SubMatches: [ "bob.jones@contoso.com" ],

StartMatch: 11

}

Match( "Bob Jones ", "" & Match.Email & ")>"

仅提取联系信息的电子邮件部分。 找不到合法地址(没有 @ 符号),因此函数返回 blank。

blank

Match( Language(), "(\w{2})(?:-(?

提取 Language 函数文档。 (?: 运算符将字符分组,而不创建另一个子匹配项。

{

language: "en",

script: blank,

region: "US",

FullMatch: "en-US",

SubMatches: [ "en", "", "US" ],

StartMatch: 1

}

Match( "PT2H1M39S", "PT(?:\d+)H)?(?:(?\d+)M)?(?:(?\d+)S)?" )

从 ISO 8601 持续时间值中提取小时、分钟和秒。 提取的数字仍在文本字符串中;使用 Value 函数将文本字符串转换为数字,然后再对其执行数学运算。

{

hours: "2",

minutes: "1",

seconds: "39",

FullMatch: "PT2H1M39S",

SubMatches: [ "2", "1", "39" ],

StartMatch: 1

}

让我们深入探索一下最后一个示例。 如果要使用 Match 返回的记录运行

With(

Match( "PT2H1M39S", "PT(?:(?\d+)H)?(?:(?\d+)M)?(?:(?\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”的所有匹配项。 此字符串包含两个匹配项,但仅返回第一个匹配项,因为您使用的是 Match,而不是 MatchAll。 SubMatches 列是空的,因为没有定义子匹配项。

{

FullMatch: "The",

SubMatches: [ ],

StartMatch: 32

}

MatchAll( pangram, "the" )

在 pangram 变量包含的文本字符串中找到“the”的所有匹配项。 此测试区分大小写,因此仅找到“the”的第二个实例。 SubMatches 列是空的,因为没有定义子匹配项。

pangram-the-one.png

MatchAll( pangram, "the", IgnoreCase )

在 pangram 变量包含的文本字符串中找到“the”的所有匹配项。 在此例中,测试不区分大小写,因此找到了该单词的全部两个实例。 SubMatches 列是空的,因为没有定义子匹配项。

pangram-the-two.png

MatchAll( pangram, "\b\wo\w\b" )

查找所有三个字母的单词,中间带有“o”。 请注意,“brown”被排除在外,因为它不是三个字母的单词,因此未匹配“\b”(单词边界)。

pangram-fox-dog.png

Match( pangram, "\b\wo\w\b\s\*(?\w.+\w)\s\*\b\wo\w\b" )

匹配“fox”和“dog”之间的所有字符。

{

between: "jumps over the lazy",

FullMatch: "fox jumps over the lazy dog",

SubMatches: [ "jumps over the lazy" ],

StartMatch: 17

}

要查看库中的 MatchAll 的结果,请执行以下操作:

在空屏幕中,插入一个空白垂直

将库的 Items 属性设置为 MatchAll( pangram, "\w+" ) 或 MatchAll( pangram, MultipleLetters )。

pangram-gallery1.png

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

将标签的 文本 属性设置为 ThisItem.FullMatch。

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

pangram-gallery2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
括号匹配是一种常见的语法检查问题,可以使用堆栈(Stack)数据结构来实现。 具体实现步骤如下: 1. 定义一个堆栈(Stack)数据结构,用来存储左括号。 2. 从左到右遍历字符串中的每个字符,如果遇到左括号,则将其入栈。 3. 如果遇到右括号,判断堆栈是否为空,如果为空,则表明右括号没有匹配的左括号,返回错误。 4. 如果堆栈不为空,则将栈顶元素出栈,判断出栈的左括号是否与当前的右括号匹配,如果不匹配,则返回错误。 5. 遍历完字符串后,如果堆栈中仍有左括号未被匹配,则返回错误。 6. 如果字符串中所有括号都匹配成功,则返回正确。 示例代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10 typedef struct { char *base; // 栈底指针 char *top; // 栈顶指针 int stack_size; // 栈可用的最大容量 } Stack; void InitStack(Stack *S) { S->base = (char *) malloc(STACK_INIT_SIZE * sizeof(char)); if (!S->base) { exit(0); // 分配内存失败,直接退出程序 } S->top = S->base; S->stack_size = STACK_INIT_SIZE; } void Push(Stack *S, char c) { if (S->top - S->base >= S->stack_size) { S->base = (char *) realloc(S->base, (S->stack_size + STACK_INCREMENT) * sizeof(char)); if (!S->base) { exit(0); // 分配内存失败,直接退出程序 } S->top = S->base + S->stack_size; S->stack_size += STACK_INCREMENT; } *(S->top) = c; S->top++; } char Pop(Stack *S) { if (S->top == S->base) { exit(0); // 栈为空,直接退出程序 } S->top--; return *(S->top); } int IsEmpty(Stack *S) { return S->top == S->base; } int IsMatch(char left, char right) { if (left == '(' && right == ')') { return 1; } if (left == '[' && right == ']') { return 1; } if (left == '{' && right == '}') { return 1; } return 0; } int CheckBrackets(char *str) { Stack S; InitStack(&S); int len = strlen(str); int i; for (i = 0; i < len; i++) { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { Push(&S, str[i]); } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { if (IsEmpty(&S)) { return 0; } char left = Pop(&S); if (!IsMatch(left, str[i])) { return 0; } } } if (!IsEmpty(&S)) { return 0; } return 1; } int main() { char str[100]; printf("请输入字符串:"); scanf("%s", str); if (CheckBrackets(str)) { printf("括号匹配成功!\n"); } else { printf("括号匹配失败!\n"); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值