text.segmented-match
- 区切られた文字列のマッチ ¶しばしば、複数の単語をデリミタでつないだ文字列を、各単語のプレフィクスだけを指定して
サーチしたいことがあります。例えばc-w-c-c
を指定して
call-with-current-continuation
を探す、というようなことです。
これはシンボルの補完などによく使われ、
GaucheのREPLでも採用しています (入力の編集参照)。
このモジュールは、そういうサーチをするための基本的な部品を提供します。
{text.segmented-match
}
patternとwordはともに文字列、separatorは
文字、文字集合、正規表現、文字を取る述語、あるいは文字列のいずれかでなければなりません。
separatorが省略された場合は#\-
が使われます。
まずpatternとwordがseparatorを区切りとして
string-split
により分割されます (文字列を扱うその他の手続き参照)。
そして、patternの分割されたそれぞれの断片が全てwordの分割された対応する
断片のプレフィクスになっている場合に#t
が、そうでなければ#f
が返されます。
wordの断片の方がpatternの断片より多い場合は、余った分は無視されます。
(segmented-match? "a-b-c" "alpha-bravo-charlie") ⇒ #t (segmented-match? "a-b" "alpha-bravo-charlie") ⇒ #t (segmented-match? "al-br-char" "alpha-bravo-charlie") ⇒ #t (segmented-match? "a-b" "alpha-delta-charlie") ⇒ #t
{text.segmented-match
}
segmented-match?
の下請け手続きです。
一つの文字列引数wordを取る述語関数を返します。その関数は、
patternのそれぞれの断片のうち、wordの対応する断片の
プレフィクスになっていないものがひとつでもあれば#f
を返します。
そうでない場合、wordの断片の数とpatternの断片の数が同じであれば
#t
が、wordの断片の数が多ければ、wordのマッチしなかった
残りの部分 (先頭のseparatorは除く) が返されます。
((make-segmented-prefix-matcher "a-b-c" #\-) "alpha-bravo-charlie") ⇒ #t ((make-segmented-prefix-matcher "a-b" #\-) "alpha-bravo-charlie-delta") ⇒ "charlie-delta" ((make-segmented-prefix-matcher "a-b" #\-) "alpha-charlie-delta") ⇒ #f
この手続きはpatternをプリプロセスするので、一つのパターンに対して
多くの単語をマッチさせたい場合は、毎回segmented-prefix?
を呼び出すより
効率的です。