For Development HEAD DRAFTSearch (procedure/syntax/module):

12.77 text.segmented-match - 区切られた文字列のマッチ

Module: text.segmented-match

しばしば、複数の単語をデリミタでつないだ文字列を、各単語のプレフィクスだけを指定して サーチしたいことがあります。例えばc-w-c-cを指定して call-with-current-continuationを探す、というようなことです。 これはシンボルの補完などによく使われ、 GaucheのREPLでも採用しています (入力の編集参照)。

このモジュールは、そういうサーチをするための基本的な部品を提供します。

Function: segmented-prefix? pattern word :optional separator

{text.segmented-match} patternwordはともに文字列、separatorは 文字、文字集合、正規表現、文字を取る述語、あるいは文字列のいずれかでなければなりません。 separatorが省略された場合は#\-が使われます。

まずpatternwordseparatorを区切りとして 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
Function: make-segmented-prefix-matcher pattern separator

{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?を呼び出すより 効率的です。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT