Main Content

pattern

テキストの検索および一致に使用されるパターン

R2020b 以降

説明

"パターン" は、containsmatchesextract などのテキスト検索関数を使用して、テキストを一致させる際のルールを定義します。"パターン式" は、パターン関数、演算子、リテラル テキストを使用して作成できます。たとえば、MATLAB® のリリース名は、"R" で始まり、その後に 4 桁の年、そして "a" または "b" のいずれかが続きます。このリリース名の形式に一致するパターンを定義します。

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

このパターンを string で一致させます。

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

作成

パターンは、+|、および ~ 演算子を使用して、リテラル テキストとその他のパターンによって構成されます。オブジェクト関数を使用して、共通のパターンを作成することもできます。これらは、多くの場合、正規表現と関連します。

  • 文字一致パターン – 幅広い文字と数字、ワイルドカード、または空白。例: lettersPattern

  • 検索ルール – パターンが出現しなければならない回数、大文字と小文字の区別、オプションのパターン、名前付きの式。例: asManyOfPatternおよびoptionalPattern

  • 境界 – 一連の特定の文字の開始境界または終了境界。例: alphanumericBoundary。境界パターンは ~ 演算子を使用して否定できます。そのため、境界に一致した場合はパターン式に一致しなくなります。

  • パターンの構成 – パターンの構造を定義し、パターン式の表示方法を指定します。例: maskedPatternおよびnamedPattern

構文 pat = pattern(txt) を使用することで、関数 pattern でパターン関数を作成することもできます。ここで、txtpat が一致するリテラル テキストです。パターン関数は、関数の引数の検証のためにパターン タイプを指定するのに役立ちます。しかし、MATLAB のテキスト一致関数はテキスト入力を受け入れるため、その他のケースで pattern 関数が必要になることはほとんどありません。

オブジェクト関数

すべて展開する

containsパターンが文字列内にあるかどうかの判別
matchesパターンが string と一致するかどうかの判別
count文字列内でのパターンの出現回数をカウント
endsWith文字列がパターンで終了しているかどうかを判別
startsWith文字列がパターンで開始するかどうかの判別
extractstring から部分文字列を抽出する
replace1 つ以上の部分文字列の検索および置換
replaceBetween始点と終点の間の部分文字列の置換
split区切り記号での string の分割
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 は、一般的な文字一致パターンの 1 つで、文字に一致します。1 つ以上の文字に一致するパターンを作成します。

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

contains を使用して、pat に一致する文字が各 string に存在するかどうかを判別します。出力された logical 配列から、txt の最初の 5 つの string には文字が含まれますが、6 つ目の string には含まれないことが分かります。

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

   1   1   1   1   1   0

テキストが指定されたパターンで始まっているかどうかを判別します。出力された logical 配列から、txt のうち 4 つの string は文字で始まっているが、2 つの string はそうではないことが分かります。

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

   1   1   0   1   1   0

string が指定されたパターンに完全に一致するかどうかを判別します。出力された logical 配列から、txt のうち、文字しか含まない string がどれであるかが分かります。

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

   1   0   0   1   1   0

パターンが一致した回数をカウントします。出力された数値配列から、lettersPatterntxt の各要素で何回一致したかが分かります。lettersPattern は、1 つ以上の文字に一致するため、連続する複数の文字から成るグループは 1 回の一致になることに注意してください。

count(txt,pat)
ans = 1×6

     1     2     1     1     1     0

digitsPattern は、一般的な文字一致パターンの 1 つで、数字に一致します。数字に一致するパターンを作成します。

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.";

alphanumericsPattern を使用して、pat を個別の文字に一致する pattern オブジェクトとして作成します。パターンを抽出します。

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

各文字の出現回数のヒストグラムを表示します。

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

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

maskedPattern を使用して、複雑なパターン式の代わりに変数を表示します。

数字と算術演算子で構成されるシンプルな演算式に一致するパターンを作成します。

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

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

mathSymbols を使用して、文字と文字の間に空白を含む演算式に一致するパターンを作成します。

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

  Use details to show more information

いくつかの演算式を含む string を作成した後、テキストからパターンを抽出します。

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"

2 つの名前付きパターンから 1 つのパターンを作成します。パターンに名前を付けることで、パターンの表示にコンテキストが加わります。

次の 2 つのパターンを作成します。1 つは、先頭と末尾が文字 D である単語に一致させます。もう 1 つは、先頭と末尾が文字 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

  Use details to show more information

string を作成し、パターンに一致するテキストを抽出します。

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

メール アドレスに一致する、可読性の高いパターンを作成します。

メール アドレスは、username@domain.TLD の構造になっています。ここで、usernamedomain は、ピリオドで区切られた識別子で構成されます。英数字および "_" 文字の任意の組み合わせから成る識別子に一致するパターンを作成します。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";

メールのローカル部分 (ピリオドで区切られた 1 つ以上の識別子) に一致するパターンを作成します。これまで定義したパターンを組み合わせて、ドメイン、TLD、および可能な任意のサブドメインに一致するパターンを作成します。namedPattern を使用して、これらの各パターンを名前付きパターンに割り当てます。

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

これらすべてのパターンを組み合わせて、1 つのパターン式にします。namedPattern を使用して、名前付きパターンに usernamedomain、および 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"

  Use details to show more information

メール アドレスを 1 つ含む string を作成し、テキストからパターンを抽出します。

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"

  Use details to show more information

拡張機能

スレッドベースの環境
MATLAB® の backgroundPool を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool を使用してコードを高速化します。

バージョン履歴

R2020b で導入