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