Создайте выражения шаблона

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

Смотрите также

| | | | |

Похожие темы