Построение выражений шаблона

Начиная с 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

См. также

| | | | |

Похожие темы