pattern

Шаблоны для поиска и соответствия текста

Описание

Шаблон определяет правила для соответствия текста с функциями поиска текста, такими как contains, matches, и extract. Вы можете создать выражение шаблона с помощью функций шаблона, операторов и буквенного текста. Для примера, MATLAB® release names, начните с "R", далее следует четырехзначный год, а затем "a" или "b". Определите шаблон, соответствующий формату имен релизов:

pat = "R" + digitsPattern(4) + ("a"|"b");

Соответствовать этому шаблону в строке:

str = ["String was introduced in R2016b." 
       "Pattern was added in R2020b."];
extract(str,pat)
ans =
  2x1 string array
    "R2016b"
    "R2020b"

Создание

Шаблоны состоят из буквенного текста и других шаблонов, использующих +, |, и ~ операторы. Можно также создать общие шаблоны с помощью Функций объекта, которые используют правила, часто связанные с регулярными выражениями:

  • Шаблоны соответствия символов - области значений букв или цифр, подстановочные знаки или пробелы, такие как lettersPattern.

  • Правила поиска - сколько раз должен происходить шаблон, чувствительность случая, необязательные шаблоны и именованные выражения, такие как optionalPattern.

  • Контуры - Контуры в начале или конце запуска определенных символов, таких как alphanumericBoundary. Краевые шаблоны могут быть сведены на нет с помощью ~ оператор, чтобы соответствовать контуру, препятствует совпадению их выражений шаблона.

  • Организация шаблона - задайте структуру шаблона и укажите, как отображаются выражения шаблона, такие как maskedPattern и namedPattern.

Функция pattern также создает функции шаблона с синтаксисом, pat = pattern(txt), где txt - буквенный текст, который pat соответствует. Функции шаблона полезны для определения типа шаблона для валидации аргумента функции. Однако pattern функция редко требуется для других случаев, потому что функции соответствия тексту MATLAB принимают текстовые входы.

Функции объекта

расширить все

containsОпределите, находится ли шаблон в строках
matchesОпределите, соответствует ли шаблон строкам
countОтсчитывайте вхождения шаблона в строках
endsWithОпределите, заканчиваются ли строки шаблоном
startsWithОпределите, начинаются ли строки с шаблона
extractИзвлечение подстрок из строк
replaceНайдите и замените одну или несколько подстрок
replaceBetweenЗамените подстроки между начальной и конечной точками
splitРазделение строк в разделителях
eraseУдалите подстроки в строках
eraseBetweenУдалите подстроки между начальной и конечной точками
extractAfterИзвлечение подстрок после заданных положений
extractBeforeИзвлеките подстроки перед заданными положениями
extractBetweenИзвлеките подстроки между начальной и конечной точками
insertAfterВставка строк после заданных подстрок
insertBeforeВставка строк перед заданными подстроками
digitsPattern Совпадение символов цифр
lettersPatternСовпадение символов буквы
alphanumericsPatternСовпадайте с буквой и цифрой символов
characterListPatternСовпадать с символами из списка
whitespacePatternСовпадение пробелов в символы
wildcardPatternСовпадает с несколькими символами любого типа
optionalPatternСделайте шаблон необязательным, чтобы соответствовать
possessivePatternСовпадайте с шаблоном без обратного отслеживания
caseSensitivePatternСопоставьте шаблон с чувствительностью случая
caseInsensitivePatternШаблон соответствия независимо от случая
asFewOfPatternСовпадайте с шаблоном как можно реже
asManyOfPatternСовпадайте с шаблоном как можно больше раз
alphanumericBoundaryСоответствие контура между алфавитно-цифровыми и неалфавитно-цифровыми символами
digitBoundaryСоответствие контура между символами цифр и символами без цифр
letterBoundaryСоответствие контура между буквой символами и небуквой символами
whitespaceBoundaryСоответствие контура между символами пробелов и символами, не являющимися пробелами
lineBoundaryСовпадение начала или конца линии
textBoundaryСовпадение начала или конца текста
lookAheadBoundaryСовпадайте с контуром перед заданным шаблоном
lookBehindBoundaryСоответствовать контуру, следующей за заданным шаблоном
regexpPatternШаблон, соответствующий заданному регулярному выражению
maskedPatternШаблон с заданным отображаемым именем
namedPatternОбозначить именованный шаблон

Примеры

свернуть все

lettersPattern является типичным шаблоном, соответствующим символам букв. Создайте шаблон, соответствующий одному или нескольким буквенным символам.

txt = ["This" "is a" "1x6" "string" "array" "."];
pat = lettersPattern;

Использование contains чтобы определить, совпадают ли символы с pat присутствуют в каждой строке. Выходной логический массив показывает, что первые пять строк в txt содержат буквы, но шестая строка не содержит.

contains(txt,pat)
ans = 1x6 logical array

   1   1   1   1   1   0

Определите, начинается ли текст с заданного шаблона. Логический массив выхода показывает, что четыре строки в txt начнем с букв, но две строки не начинаются.

startsWith(txt,pat)
ans = 1x6 logical array

   1   1   0   1   1   0

Определите, полностью ли строка соответствует указанному шаблону. Выходной логический массив показывает, в какой из строк txt не содержат ничего, кроме букв.

matches(txt,pat)
ans = 1x6 logical array

   1   0   0   1   1   0

Подсчитайте количество совпадений шаблона. Численный массив выхода показов, сколько раз lettersPattern совпадает в каждом элементе txt. Обратите внимание, что lettersPattern соответствует одной или нескольким буквам, поэтому группа параллельных букв соответствует одной.

count(txt,pat)
ans = 1×6

     1     2     1     1     1     0

digitsPattern является типичным шаблоном, соответствующим символам цифр. Создайте шаблон, соответствующий цифровым символам.

txt = ["1 fish" "2 fish" "[1,0,0] fish" "[0,0,1] fish"];
pat = digitsPattern;

Использование replace для редактирования фрагментов текста, совпадающих с шаблоном.

replace(txt,pat,"#")
ans = 1x4 string
    "# fish"    "# fish"    "[#,#,#] fish"    "[#,#,#] fish"

Создать новую часть текста путем вставки "!" символ после совпадающих букв.

insertAfter(txt,pat,"!")
ans = 1x4 string
    "1! fish"    "2! fish"    "[1!,0!,0!] fish"    "[0!,0!,1!] fish"

Шаблоны могут быть созданы с помощью оператора OR, |, с текстом. Стереть текст, соответствующий указанному шаблону.

txt = erase(txt,"," | "]" | "[")
txt = 1x4 string
    "1 fish"    "2 fish"    "100 fish"    "001 fish"

Извлечение pat из нового текста.

extract(txt,pat)
ans = 1x4 string
    "1"    "2"    "100"    "001"

Используйте шаблоны для подсчета вхождений отдельных символов в фрагменте текста.

txt = "She sells sea shells by the sea shore.";

Создание pat как pattern объект, который соответствует отдельным буквам, используя alphanumericsPattern. Извлеките шаблон.

pat = alphanumericsPattern(1);
letters = extract(txt,pat);

Отображение гистограммы количества вхождений каждой буквы.

letters = lower(letters);
letters = categorical(letters);
histogram(letters)

Figure contains an axes. The axes contains an object of type categoricalhistogram.

Использование maskedPattern отображение переменной вместо сложного выражения шаблона.

Создайте шаблон, который совпадает с простыми арифметическими выражениями, состоящими из чисел и арифметических операторов.

mathSymbols = asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)
mathSymbols = pattern
  Matching:

    asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)

Создайте шаблон, который совпадает с арифметическими выражениями с пробелами между символами, используя arithmeticPat.

longExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
longExpressionPat = pattern
  Matching:

    asManyOfPattern(asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1) + whitespacePattern) + asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)

Отображаемое выражение шаблона является длинным и трудным для чтения. Использование maskedPattern чтобы отобразить имя переменной, mathSymbols, вместо выражения шаблона.

mathSymbols = maskedPattern(mathSymbols);
shortExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
shortExpressionPat = pattern
  Matching:

    asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols

  Show all details

Создайте строку , содержащую некоторые арифметические выражения, а затем извлеките шаблон из текста.

txt = "What is the answer to 1 + 1? Oh, I know! 1 + 1 = 2!";
arithmetic = extract(txt,shortExpressionPat)
arithmetic = 2x1 string
    "1 + 1"
    "1 + 1 = 2"

Создайте шаблон из двух именованных шаблонов. Шаблоны имен добавляют контекст к отображению шаблона.

Создайте два шаблона: тот, который совпадает со словами, которые начинаются и заканчиваются буквой D, и тот, который совпадает со словами, которые начинаются и заканчиваются буквой R.

dWordsPat = letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary;
rWordsPat = letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary;

Создайте шаблон с помощью именованных шаблонов, который находит слово, которое начинается и заканчивается D, за которым следует слово, которое начинается и заканчивается R.

dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
  Matching:

    letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary + whitespacePattern + letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary

Этот шаблон трудно считать и не передает много информации о его назначении. Использование namedPattern для обозначения шаблонов как именованных шаблонов, которые отображают заданные имена и описания вместо выражений шаблонов.

dWordsPat = namedPattern(dWordsPat,"dWords", "Words that start and end with D");
rWordsPat = namedPattern(rWordsPat,"rWords", "Words that start and end with R");
dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
  Matching:

    dWords + whitespacePattern + rWords

  Using named patterns:

    dWords: Words that start and end with D
    rWords: Words that start and end with R

  Show more details

Создайте строку и извлеките текст, соответствующий шаблону.

txt = "Dad, look at the divided river!";
words = extract(txt,dAndRWordsPat)
words = 
"divided river"

Создайте простой в чтении шаблон, чтобы соответствовать адресам электронной почты.

Адреса электронной почты соответствуют имени пользователя @ domain.TLD структуры, где имя пользователя и область состоят из идентификаторов, разделенных по периодам. Создайте шаблон, соответствующий идентификаторам, состоящим из любой комбинации алфавитно-цифровых символов и "_" персонажи. Использование maskedPattern чтобы назвать этот шаблон identifier.

identifier = asManyOfPattern(alphanumericsPattern(1) | "_", 1);
identifier = maskedPattern(identifier);

Создайте шаблоны, чтобы соответствовать областям и поддоменам, состоящим из идентификаторов. Создайте шаблон, который совпадает с TLD из заданного списка.

subdomain = asManyOfPattern(identifier + ".") + identifier;
domainName = namedPattern(identifier,"domainName");
tld = "com" | "org" | "gov" | "net" | "edu";

Создайте шаблон для соответствия локальной части письма, который совпадает с одним или несколькими идентификаторами, разделенными периодами. Создайте шаблон для соответствия области, TLD и любым потенциальным поддоменам путем объединения ранее определенных шаблонов. Использование namedPattern чтобы назначить каждый из этих шаблонов именованному шаблону.

username = asManyOfPattern(identifier + ".") + identifier;
domain = optionalPattern(namedPattern(subdomain) + ".") + ...
            domainName + "." + ...
            namedPattern(tld);

Объедините все шаблоны в одно выражение шаблона. Использование namedPattern для назначения username, domain, и emailPattern в именованные шаблоны.

emailAddress = namedPattern(username) + "@" + namedPattern(domain);
emailPattern = namedPattern(emailAddress)
emailPattern = pattern
  Matching emailAddress:

    username + "@" + domain

  Using named patterns:

    emailAddress  : username + "@" + domain
      username    : asManyOfPattern(identifier + ".") + identifier
      domain      : optionalPattern(subdomain + ".") + domainName + "." + tld
        subdomain : asManyOfPattern(identifier + ".") + identifier
        domainName: identifier
        tld       : "com" | "org" | "gov" | "net" | "edu"

  Show all details

Создайте строку, содержащую адрес электронной почты, а затем извлеките шаблон из текста.

txt = "You can reach me by email at John.Smith@department.organization.org";
extract(txt,emailPattern)
ans = 
"John.Smith@department.organization.org"

Именованные шаблоны позволяют индексировать точку в порядок для доступа к именованным подшаблонам. Используйте индексацию точек, чтобы назначить определенное значение именованному шаблону domain.

emailPattern.emailAddress.domain = "mathworks.com"
emailPattern = pattern
  Matching emailAddress:

    username + "@" + domain

  Using named patterns:

    emailAddress: username + "@" + domain
      username  : asManyOfPattern(identifier + ".") + identifier
      domain    : "mathworks.com"

  Show all details

Введенный в R2020b