Начиная с R2020b
Шаблоны являются инструментом, который помогает в поиске и изменении текста. Подобно регулярным выражениям, шаблон задает правила для соответствия текста. Шаблоны могут использоваться с функциями поиска текста, такими как contains
, matches
, и extract
указать, на какие фрагменты текста действуют эти функции. Вы можете создать выражение шаблона таким же образом, как и математическое выражение, используя функции шаблона, операторы и буквенный текст. Поскольку выражения шаблона создания являются открытыми, шаблоны могут стать довольно сложными. Построение шаблонов в шагах и использование таких функций, как maskedPattern
и namedPattern
может помочь организовать сложные шаблоны.
Самый простой шаблон построен из одной функции шаблона. Для примера, lettersPattern
соответствует любым буквенным символам. Существует много функций шаблона для соответствия различных типов символов и других особенностей текста. Список этих функций можно найти на pattern
страница с описанием.
txt = "abc123def";
pat = lettersPattern;
extract(txt,pat)
ans = 2x1 string
"abc"
"def"
Шаблоны объединяются с другими шаблонами и буквенным текстом при помощи plus(+)
оператор. Этот оператор добавляет шаблоны и текст вместе в том порядке, в котором они определены в выражении шаблона. Объединенные шаблоны совпадают только с текстом в том же порядке. В этом примере «YYYY/MM/DD» не матч, потому что четыре буквенных строки должны быть в конце текста.
txt = "Dates can be expressed as MM/DD/YYYY, DD/MM/YYYY, or YYYY/MM/DD"; pat = lettersPattern(2) + "/" + lettersPattern(2) + "/" + lettersPattern(4); extract(txt,pat)
ans = 2x1 string
"MM/DD/YYYY"
"DD/MM/YYYY"
Шаблоны, используемые с or(|)
оператор указывает, что только один из двух заданных шаблонов должен совпадать с разделом текста. Если ни один из шаблонов не может совпадать, выражение шаблона не совпадает.
txt = "123abc";
pat = lettersPattern|digitsPattern;
extract(txt,pat)
ans = 2x1 string
"123"
"abc"
Некоторые функции шаблона берут шаблоны в качестве входов и модифицируют их каким-либо образом. Для примера, optionalPattern
обеспечивает соответствие заданного шаблона, если это возможно, но этот шаблон не требуется для успешного соответствия.
txt = ["123abc" "abc"]; pat = optionalPattern(digitsPattern) + lettersPattern; extract(txt,pat)
ans = 1x2 string
"123abc" "abc"
Контурные шаблоны являются особым типом шаблона, который не совпадает с символами, а скорее соответствует контурам между обозначенным типом символов и другими символами или началом или концом этого фрагмента текста. Для примера, digitBoundary
соответствуют контуры между символами цифр и символами без цифр и между символами цифр и началом или концом текста. Оно не соответствует самим символам цифр. Краевые шаблоны полезны в качестве разделителей для таких функций, как split
.
txt = "123abc";
pat = digitBoundary;
split(txt,pat)
ans = 3x1 string
""
"123"
"abc"
Краевые шаблоны являются особенными среди шаблонов, потому что они могут быть отменены с помощью not(~)
оператор. Когда это отрицает, шаблоны границ совпадают до или после символов, которые не удовлетворяют вышеуказанным требованиям. Для примера, ~digitBoundary
соответствует контуру между:
символы, которые являются обеими цифрами
символы, которые являются недигитами
недигит- символ и начало или конец фрагмента текста
Использование replace
чтобы отметить местоположения, совпадающие по ~digitBoundary
с "|"
символ.
txt = "123abc"; pat = ~digitBoundary; replace(txt,pat,"|")
ans = "1|2|3a|b|c|"
Иногда простого шаблона недостаточно для решения задачи и необходим более сложный шаблон. Когда выражение шаблона растет, может стать трудно понять, что оно соответствует. Один из способов упростить создание сложного шаблона - создать каждую часть шаблона отдельно, а затем объединить детали вместе в одно выражение шаблона.
Для образца адреса электронной почты используют local_part@domain.TLD формы. Каждый из трех идентификаторов - local_part, область и TLD - должен быть комбинацией цифр, букв и символов подчеркивания. Чтобы создать полный шаблон, начните с определения шаблона для идентификаторов. Создайте шаблон, соответствующий одному символу буквы или цифры или одному символу подчеркивания.
identCharacters = alphanumericsPattern(1) | "_";
Теперь используйте asManyOfPattern
для соответствия одному или нескольким последовательным образцам identCharacters
.
identifier = asManyOfPattern(identCharacters,1);
Затем создайте шаблон, соответствующий электронной почте, содержащей несколько идентификаторов.
emailPattern = identifier + "@" + identifier + "." + identifier;
Проверьте шаблон, увидев, насколько хорошо он соответствует следующим примерам электронных писем.
exampleEmails = ["janedoe@mathworks.com" "abe.lincoln@whitehouse.gov" "alberteinstein@physics.university.edu"]; matches(exampleEmails,emailPattern)
ans = 3x1 logical array
1
0
0
Шаблон не соответствует нескольким из примерных писем, хотя все письма действительны. И local_part, и область могут быть сделаны из ряда идентификаторов, которые разделены периодами. Используйте identifier
шаблон, чтобы создать шаблон, который способен совпадать с серией идентификаторов. asManyOfPattern
соответствует как можно большему числу параллельных внешних видов заданного шаблона, но если их нет, остальная часть шаблона все еще может успешно соответствовать.
identifierSeries = asManyOfPattern(identifier + ".") + identifier;
Используйте этот шаблон для создания нового emailPattern
которые могут совпадать со всеми примерами электронных писем.
emailPattern = identifierSeries + "@" + identifierSeries + "." + identifier; matches(exampleEmails,emailPattern)
ans = 3x1 logical array
1
1
1
Сложные шаблоны иногда могут быть трудными для чтения и интерпретации, особенно теми, с кем вы разделяете их, которые не знакомы со структурой шаблона. Для примера при отображении emailPattern
долго и трудно читается.
emailPattern
emailPattern = pattern
Matching:
asManyOfPattern(asManyOfPattern(alphanumericsPattern(1) | "_",1) + ".") + asManyOfPattern(alphanumericsPattern(1) | "_",1) + "@" + asManyOfPattern(asManyOfPattern(alphanumericsPattern(1) | "_",1) + ".") + asManyOfPattern(alphanumericsPattern(1) | "_",1) + "." + asManyOfPattern(alphanumericsPattern(1) | "_",1)
Часть проблемы с отображением заключается в том, что существует много повторений identifier
шаблон. Если точные детали этого шаблона не важны для пользователей шаблона, то отображение identifier
шаблон можно скрыть, используя maskedPattern
. Эта функция создает новый шаблон, где отображаются identifier
маскирована и имя переменной, "identifier"
, отображается вместо этого. Кроме того, можно задать другое имя для отображения. К деталям шаблонов, которые маскируются таким образом, можно получить доступ, нажав кнопку "Show all details
"в отображаемом шаблоне.
identifier = maskedPattern(identifier);
identifierSeries = asManyOfPattern(identifier + ".") + identifier
identifierSeries = pattern
Matching:
asManyOfPattern(identifier + ".") + identifier
Show all details
Шаблоны могут быть дополнительно организованы с помощью namedPattern
функция. namedPattern
определяет шаблон как именованный шаблон, который изменяет способ отображения шаблона при объединении с другими шаблонами. Адреса электронной почты имеют несколько важных фрагментов, local_part@domain.TLD, каждый из которых имеет свои собственные правила соответствия. Создайте именованный шаблон для каждого сечения.
localPart = namedPattern(identifierSeries,"local_part");
Именованные шаблоны могут быть вложены, чтобы дополнительно очертить части шаблона. Чтобы вложить именованный шаблон, создайте шаблон с помощью именованных шаблонов, а затем определите этот шаблон как именованный шаблон. Для примера Области .TLD можно разделить на область, поддомены и область верхнего уровня (TLD). Создайте именованные шаблоны для каждой части области. TLD .
subdomain = namedPattern(identifierSeries,"subdomain"); domainName = namedPattern(identifier,"domainName"); tld = namedPattern(identifier,"TLD");
Вложите именованные шаблоны для компонентов области под один именованный шаблон domain
.
domain = optionalPattern(subdomain + ".") + ... domainName + "." + ... tld; domain = namedPattern(domain);
Объедините шаблоны в один именованный шаблон, emailPattern
. В отображении emailPattern
вы можете увидеть каждый именованный шаблон и то, что они совпадают, а также информацию о любых вложенных именованных шаблонах.
emailPattern = localPart + "@" + domain
emailPattern = pattern
Matching:
local_part + "@" + domain
Using named patterns:
local_part : asManyOfPattern(identifier + ".") + identifier
domain : optionalPattern(subdomain + ".") + domainName + "." + TLD
subdomain : asManyOfPattern(identifier + ".") + identifier
domainName: identifier
TLD : identifier
Show all details
Вы можете получить доступ к именованным шаблонам и вложенным именованным шаблонам путем индексации точек в шаблон. Для примера можно получить доступ к вложенному именованному шаблону subdomain
путем индексации через точку из emailPattern
в domain
и затем снова индексация через точку в subdomain
.
emailPattern.domain.subdomain
ans = pattern
Matching:
asManyOfPattern(identifier + ".") + identifier
Show all details
Назначение точек может использоваться, чтобы изменить именованные шаблоны, не переписывая остальную часть выражения шаблона.
emailPattern.domain = "mathworks.com"
emailPattern = pattern
Matching:
local_part + "@" + domain
Using named patterns:
local_part: asManyOfPattern(identifier + ".") + identifier
domain : "mathworks.com"
Show all details
contains
| extract
| pattern
| regexp
| replace
| string