Начиная с 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");
Названные шаблоны могут быть вложены, чтобы далее формировать рисунок частей шаблона. Чтобы вложить именованный шаблон, создайте шаблон с помощью названный шаблонами и затем определяйте тот шаблон как именованный шаблон. Например, Domain.TLD может быть разделен на область, субдомены и область верхнего уровня (TLD). Создайте названные шаблоны для каждой части domain.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