Pattern: matchAt()

与えられた文字列中の対象の Pattern に一致する部分単語列の出現する先頭の位置を探します。

位置は 0 始まりのインデックスで、一致位置の単語が出現するまでの単語数を表します。

構文

pattern.matchAt(s) => number

引数

  • s: string

    検査する文字列です。

返値: number

一致する場合は一致した単語列の先頭位置を示す 0 以上の整数値、一致しない場合は負の値を返します。

完全一致および前方一致のパターンに対しては、一致する場合は常に 0 を返します。

後方一致および部分一致のパターンに対しては、一致する場合は 0 より大きい整数値を返します。

例外

  • TypeError
    • 引数 s が文字列でなかった場合。

引数 s は斜線 ("/") で区切られた単語列として扱われます。

引数 s が斜線 ("/") から始まる場合、先頭に空文字列の単語が挿入されているとみなします。例えば "/foo/bar" における "bar" は先頭から数えて 3 語目であり、そのインデックスは 2 となります。

パターンの種別によって検査内容が異なります。

完全一致

kind"exact" の場合、対象の Pattern に引数の文字列が完全一致するかどうかを検査します。

完全一致における検査アルゴリズム

与えられた文字列中の単語数が対象の Pattern の単語数と同数で、それぞれの単語が文字列として一致するかを検査します。ラベルはどのような単語に対しても一致するとみなされ、ラベル以外の単語についてのみ文字列の比較が行われます。

import { Pattern } from "/alier_sys/Pattern.js";

const exact = new Pattern({ pattern: "/foo/bar/baz/qux" });

const s = "/foo/bar/baz/qux",
      t = "/foo/bar/baz/qux/nose/foobar"
;

console.log(`kind: "${exact.kind}", pattern: "${exact.pattern}"; matchAt("${s}") ==> ${exact.matchAt(s)}`);
//           kind: "exact"        , pattern: "/foo/bar/baz/qux" ;
//           matchAt("/foo/bar/baz/qux")             ==>  0
console.log(`kind: "${exact.kind}", pattern: "${exact.pattern}"; matchAt("${t}") ==> ${exact.matchAt(t)}`);
//           kind: "exact"        , pattern: "/foo/bar/baz/qux" ;
//           matchAt("/foo/bar/baz/qux/nose/foobar") ==> -1

前方一致

kind"forward" の場合、対象の Pattern に引数の文字列が前方一致するかどうかを検査します。

前方一致における検査アルゴリズム

与えられた文字列中の単語数が対象の Pattern の単語数以上で、与えられた文字列の先頭の単語列が対象の Pattern 中の末尾のワイルドカードを除いた単語列に一致するかを検査します。

import { Pattern } from "/alier_sys/Pattern.js";

const forward = new Pattern({ pattern: "/foo/bar/baz/*" });

const s = "/foo/bar/baz/qux",
      t = "/foo/bar/baz/qux/nose/foobar"
;

console.log(`kind: "${forward.kind}", pattern: "${forward.pattern}"; matchAt("${s}") ==> ${forward.matchAt(s)}`);
//           kind: "forward"        , pattern: "/foo/bar/baz/*"    ;
//           matchAt("/foo/bar/baz/qux")             ==>  0
console.log(`kind: "${forward.kind}", pattern: "${forward.pattern}"; matchAt("${t}") ==> ${forward.matchAt(t)}`);
//           kind: "forward"        , pattern: "/foo/bar/baz/*"    ;
//           matchAt("/foo/bar/baz/qux/nose/foobar") ==>  0

後方一致

kind"backward" の場合、対象の Pattern に引数の文字列が後方一致するかどうかを検査します。

後方一致における検査アルゴリズム

与えられた文字列中の単語数が対象の Pattern の単語数以上で、与えられた文字列の末尾の単語列が対象の Pattern 中の先頭のワイルドカードを除いた単語列に一致するかを検査します。

import { Pattern } from "/alier_sys/Pattern.js";

const backward = new Pattern({ pattern: "*/bar/baz/qux" });

const s = "/foo/bar/baz/qux",
      t = "/foo/bar/baz/qux/nose/foobar"
;

console.log(`kind: "${backward.kind}", pattern: "${backward.pattern}"; matchAt("${s}") ==> ${backward.matchAt(s)}`);
//           kind: "backward"        , pattern: "*/bar/baz/qux"      ;
//           matchAt("/foo/bar/baz/qux")             ==>  2
console.log(`kind: "${backward.kind}", pattern: "${backward.pattern}"; matchAt("${t}") ==> ${backward.matchAt(t)}`);
//           kind: "backward"        , pattern: "*/bar/baz/qux"      ;
//           matchAt("/foo/bar/baz/qux/nose/foobar") ==> -1

部分一致

kind"partial" の場合、対象の Pattern に引数の文字列が部分一致するかどうかを検査します。

部分一致における検査アルゴリズム

与えられた文字列中の単語数が対象の Pattern の単語数以上で、与えられた文字列の部分文字列(部分単語列)が対象の Pattern 中の先頭および末尾のワイルドカードを除いた単語列に完全一致するかを検査します。

import { Pattern } from "/alier_sys/Pattern.js";

const partial = new Pattern({ pattern: "*/bar/baz/*" });

const s = "/foo/bar/baz/qux",
      t = "/foo/bar/baz/qux/nose/foobar"
;

console.log(`kind: "${partial.kind}", pattern: "${partial.pattern}"; matchAt("${s}") ==> ${partial.matchAt(s)}`);
//           kind: "partial"        , pattern: "*/bar/baz/*"       ;
//           matchAt("/foo/bar/baz/qux")             ==>  2
console.log(`kind: "${partial.kind}", pattern: "${partial.pattern}"; matchAt("${t}") ==> ${partial.matchAt(t)}`);
//           kind: "partial"        , pattern: "*/bar/baz/*"       ;
//           matchAt("/foo/bar/baz/qux/nose/foobar") ==>  2