Функции IsMatch, Match и MatchAll
Применимо к: приложениям на основе холста приложениям на основе модели интерфейс командной строки Power Platform
Проверяет совпадение или извлекает части текстовой строки на основе шаблона.
Описание
Функция IsMatch проверяет, соответствует ли текстовая строка шаблону, который может содержать обычные символы, предварительно определенные шаблоны или регулярное выражение. Функции Match иnd MatchAll возвращают найденные совпадения, включая частичные совпадения.
Используйте IsMatch, чтобы проверить, что пользователь ввел в элемент управления Text input. Например, можно проверить, ввел ли пользователь допустимый адрес электронной почты, перед сохранением результата в источник данных. Если запись не соответствует условиям, добавьте другие элементы управления, которые напомнят пользователю, что запись необходимо исправить.
Используйте Match, чтобы извлечь первую текстовую строку, которая соответствует шаблону, и MatchAll, чтобы извлечь все текстовые строки, которые соответствуют. Вы также можете извлечь частичные совпадения для анализа сложных строк.
Match возвращает запись информации для первого найденного совпадения, а MatchAll возвращает таблицу записей для каждого найденного совпадения. Запись или записи содержат:
Column | Type | Description |
---|---|---|
именованное частичное совпадение или частичные совпадения | Текст | Каждое именованное частичное совпадение будет иметь собственный столбец. Создайте именованное частичное совпадение с помощью регулярного выражения (?<имя>...). Если именованное частичное совпадение имеет то же имя, что и один из предварительно определенных столбцов (ниже), частичное совпадение имеет приоритет, и генерируется предупреждение. Чтобы избежать этого предупреждения, переименуйте частичное совпадение. |
FullMatch | Text | Вся текстовая строка, которая была сопоставлена. |
StartMatch | Номер | Начальная позиция совпадения во входной текстовой строке. Первый символ строки возвращает 1. |
SubMatches | Таблица с одним столбцом текста (столбец Value) | Таблица именованных и неименованных частичных совпадений в порядке их появления в регулярном выражении. Как правило, с именованными частичными совпадениями легче работать, поэтому они поощряются. Используйте функцию ForAll или функции Last( FirstN( ... ) ) для работы с отдельными частичными совпадениями. Если в регулярном выражении не определены никакие частичные совпадения, эта таблица будет присутствовать, но будет пустой. |
Эти функции поддерживают MatchOptions. По умолчанию:
- Эти функции выполняют поиск с учетом регистра. Используйте MatchOptions.IgnoreCase для поиска совпадений независимо от регистра.
- IsMatch сопоставляет всю текстовую строку (MatchOption Complete), а функция Match и MatchAll ищет совпадение в любом месте текстовой строки (MatchOption Contains). Используйте Complete, Contains, BeginsWith или EndsWith в соответствии со своим сценарием.
Если текстовая строка соответствует шаблону, IsMatch возвращает значение true, в противном случае — false. Match возвращается blank значение, если не найдено совпадений, что можно проверить с помощью функции IsBlank. MatchAll возвращается пустую таблицу, если не найдено совпадений, что можно проверить с помощью функции IsEmpty.
Если вы используете MatchAll, чтобы разбить текстовую строку, рассмотрите возможность использования функции Split, которая проще в использовании и быстрее.
Шаблоны
Ключом к использованию этих функций является описание шаблона для сопоставления. Опишите шаблон в текстовой строке в виде следующей комбинации:
- Обычные символы, такие как "abc" или "123".
- Предопределенные шаблоны, такие как Letter, MultipleDigits или Email. (Эти шаблоны определяет перечисление Match.)
- Коды регулярных выражений, например "\d+\s+\d+" или "[a-z]+".
Комбинируйте эти элементы с помощью оператора объединения строк &. Например, "abc" & Digit & "\s+" является допустимым шаблоном, который соответствует символам "a", "b" и "c" с последующей цифрой от 0 до 9, за которой следует по крайней мере один пробел.
Обычные символы
Самый простой шаблон — это последовательность из обычных символов, которые должны точно совпадать.
Например, при использовании с функцией IsMatch, строка "Привет" соответствует шаблону "Привет" точно. И никак иначе. Строка "привет!" не соответствует шаблону из-за восклицательного знака в конце и из-за неверного регистра буквы "п". (Способы изменения этого поведения см. в разделе Параметры поиска совпадения.)
В языке шаблона некоторые символы зарезервированы для особых целей. Чтобы использовать эти символы, либо используйте перед знаком \ (обратную косую черту), чтобы указать, что символ должен восприниматься буквально, либо используйте один из предопределенных шаблонов, описанных далее в этой теме. В следующей таблице перечислены специальные символы.
Специальный знак | Описание |
---|---|
. | точка |
? | вопросительный знак |
* | звездочка |
+ | плюс |
( ) | круглые скобки |
[ ] | квадратные скобки |
{ } | фигурные скобки |
^ | крышка |
$ | знак доллара |
| | вертикальная черта |
\ | обратная косая черта |
Например, вы можете сопоставить «Привет?» с помощью шаблона "Привет\?" с обратной косой чертой перед знаком вопроса.
Предопределенные шаблоны
Предопределенные шаблоны предоставляют простой способ сопоставления либо с одним из наборов символов либо с последовательностью из нескольких символов. Используйте оператор объединения строк &, чтобы объединить собственные текстовые строки с перечислением Match:
Перечисление Match | Описание | Регулярное выражение |
---|---|---|
Any | Соответствует любому символу. | . |
Comma | Соответствует запятой. | , |
Digit | Соответствует числу (от 0 до 9). | \d |
Соответствует адресу электронной почты, который содержит символ "@" и имя домена с точкой (".") | .+\@.+\\.[^\\.]{2,} |
|
Hyphen | Соответствует дефису. | \- |
LeftParen | Соответствует левой круглой скобке "(". | \( |
Letter | Соответствует букве. | \p{L} |
MultipleDigits | Соответствует одной или нескольким цифрам. | \d+ |
MultipleLetters | Соответствует одной или нескольким буквам. | \p{L}+ |
MultipleNonSpaces | Соответствует одному или нескольким символам, которые не добавляют пробел (не пробел, не табуляция, не новая строка). | \S+ |
MultipleSpaces | Соответствует одному или нескольким символам, которые добавляют пробел (пробел, табуляция или новая строка). | \s+ |
NonSpace | Соответствует одному знаку, который не добавляет пробел. | \S |
OptionalDigits | Соответствует отсутствующей, одной или нескольким цифрам. | \d* |
OptionalLetters | Соответствует отсутствующей, одной или нескольким буквам. | \p{L}* |
OptionalNonSpaces | Соответствует отсутствующему, одному или нескольким символам, которые не добавляют пробел. | \S* |
OptionalSpaces | Соответствует отсутствующему, одному или нескольким символам, которые добавляют пробел. | \s* |
Period | Соответствует точке ("."). | \. |
RightParen | Соответствует правой круглой скобке ")". | \) |
Space | Соответствует символу, который добавляет пробел. | \s |
Tab | Соответствует символу табуляции. | \t |
Например, шаблон "A" & MultipleDigits будет соответствовать букве "A", за которой следует одна или несколько цифр.
Регулярные выражения
Шаблон, который используют эти функции, является регулярным выражением. Обычные символы и предварительно определенные шаблоны, описанные ранее в этой теме, можно использовать для создания регулярных выражений.
Регулярные выражения очень эффективны и доступны во многих языках программирования для использования в самых разных целях. Они также часто могут выглядеть как случайная последовательность знаков препинания. В данной статье не описываются все аспекты регулярных выражений, но в Интернете достаточное количество информации, руководств и инструментов на эту тему.
Регулярные выражения имеют различные диалекты. В Power Apps используется вариант диалекта JavaScript. См. синтаксис регулярного выражения для введения в синтаксис. Именованные частичные совпадения (иногда называемые именованными группами захвата) поддерживаются:
- Именованные частичные совпадения: (?<имя> ...)
- Именованные обратные ссылки: \k<имя>
Таблица перечисления Match ранее в этой тема каждое перечисление появляется в той же строке, что и соответствующее ему регулярное выражение.
Параметры сопоставления
Можно изменить поведение этих функций, указав один или несколько параметров, которые можно комбинировать с помощью оператора объединения строк (&).
Перечисление 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.Contains.
MatchAll( Text, Pattern [, Options ] )
- Text — обязательный аргумент. Текстовая строка для сопоставления.
- Pattern — обязательно. Шаблон для сопоставления в виде текстовой строки. Связывает предопределенные шаблоны, которые определяет перечисление Match, или предоставляет регулярное выражение. Шаблон Pattern должен быть постоянной формулой без каких-либо переменных, источников данных или других динамических ссылок, которые меняются во время работы приложения.
- Options — обязательно. Сочетание значений перечисления MatchOptions в виде текстовой строки. По умолчанию используется MatchOptions.Contains.
Примеры IsMatch
Обычные символы
Представьте, что приложение содержит элемент управления Text input с именем TextInput1. Пользователь вводит значения в этот элемент управления для сохранения в базе данных.
Пользователь вводит Hello world в TextInput1.
Формула | Описание | Результат |
---|---|---|
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})" ) |
Проверяет надежность пароля, который должен содержать восемь, девять или 10 символов, минимум одну цифру и по крайней мере одну букву. Строка не должна содержать специальные символы. | false |
Примеры Match и MatchAll
Формула | Описание | Результат |
---|---|---|
Match( "Bob Jones <bob.jones@contoso.com>", "<(?<email>" & Match.Email & ")>" |
Извлекает из контактной информации только часть, соответствующую электронной почте. | { 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. | пусто |
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, вы должны передать в нее именованные частичные совпадения индивидуально. Для этого вы можете использовать функцию With, которая работает с записью, возвращаемой функцией Match:
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" в текстовой строке, которую содержит переменная pangram. Строка содержит два совпадения, но возвращается только первое, потому что вы используете функцию Match, а не MatchAll. Столбец SubMatches пуст, потому что никакие частичные совпадения не были определены. | { FullMatch: "The", SubMatches: [ ], StartMatch: 32 } |
MatchAll( pangram, "the" ) |
Найти все совпадения с "the" в текстовой строке, которую содержит переменная pangram. Тест чувствителен к регистру, поэтому найден только второй экземпляр "the". Столбец SubMatches пуст, потому что никакие частичные совпадения не были определены. | |
MatchAll( pangram, "the", IgnoreCase ) |
Найти все совпадения с "the" в текстовой строке, которую содержит переменная pangram. В этом случае тест нечувствителен к регистру, поэтому найдены оба вхождения слова. Столбец SubMatches пуст, потому что никакие частичные совпадения не были определены. | |
MatchAll( pangram, "\b\wo\w\b" ) |
Находит все слова из трех букв с буквой "o" в середине. Обратите внимание, что слово "brown" исключено, потому что это не слово из трех букв и, следовательно, не соответствует условию "\b" (граница слова). | |
Match( pangram, "\b\wo\w\b\s\*(?<between>\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 в коллекции:
В пустой экран вставьте пустой вертикальный элемент управления Gallery.
Установите для свойства Items коллекции значение MatchAll( pangram, "\w+" ) или MatchAll( pangram, MultipleLetters ).
Выберите "Добавить элемент с вкладки «Вставка»" в центре элемента управления коллекции, чтобы выбрать шаблон коллекции.
Добавьте элемент управления Label к шаблону коллекции.
Задайте для свойства Text метки выражение ThisItem.FullMatch.
Коллекция заполняется каждым словом в нашем примере текста. Измените размер шаблона коллекции и элемента управления Label, чтобы увидеть все слова на одном экране.