exponenta event banner

Выражения шаблона построения

С 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). Создайте именованные шаблоны для каждой части домена. 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

См. также

| | | | |

Связанные темы