第 2 章 Maxima のデータとその操作
2.9 文字列
2.9.5 文字列操作の函数
文字操作の函数
¶ ³
scopy(⟨文字列⟩)
smake(⟨整数値⟩,⟨文字列⟩) charat(⟨文字列⟩,⟨整数値⟩) charlist(⟨文字列⟩)
slength(⟨文字列⟩) parsetoken(⟨文字列⟩)
sconc(⟨文字列1⟩,·, s⟨文字列n⟩) sposition(⟨文字⟩,⟨文字列⟩) sreverse(⟨文字列⟩)
strim(⟨文字列1⟩,⟨文字列2⟩) striml(⟨文字列1⟩,⟨文字列2⟩) strimr(⟨文字列1⟩,⟨文字列2⟩)
µ ´
scopy函数はLISPのcopy-seqを用いる函数で,与えられたMaximaの文字列を複製する函数 です.
smake函数はLISPのmake-string函数を用いる函数で,Maximaの文字を指定した整数個並べ て新しい文字列を生成する函数です. 例えば,smake(3,"a")からMaximaの文字列aaaが得られ ます.
charat函数は与えられたMaximaの文字列から指定した整数で表現される位置にある文字を取
り出します.因に,文字列の先頭(左端)が1で,文字列の末尾がslength函数で得られる値,即ち,文 字列の文字数になります.例えば,charat("explode",2) を実行すると,与えた文字列explodeの 先頭から二番目の文字xが返されます.因に,この函数はLISPのsubseq函数のMaximaへの実装 になります.
charlist函数は与えられたMaximaの文字列を分解してリストデータに変換する函数です.例え
ば, charlist("explode")は[e, x, p, l, o, d, e]に変換されます.LISPに依存すると思い
(%i53) charlist("explode");
(%o53) [e, x, p, l, o, d, e]
(%i54) charlist("爆発");
(%o54) [爆, 発]
slength函数は与えられたMaximaの文字列の長さを返す函数です. この函数の実体は,引数を
LISPの文字型に変換し,length函数を作用させているだけです.
parsetoken函数は与えられた文字列が数と空行,コンマ,セミコロン,タブや改行で構成されてい
る場合に,先頭の数値部分を数値に変換する函数です.
(%i106) parsetoken("1;234");
(%o106) 1
(%i107) parsetoken("1,234");
(%o107) 1
(%i108) parsetoken("1 234");
(%o108) 1
(%i109) 1/parsetoken("1234");
1
(%o109)
----1234
sconc函数はMaximaに昔からあるsconcat函数に似ていますが,出力がMaximaの文字列に なる点が異なります.構文は複数のMaximaの文字列を引数とし,これらの文字列を繋いで一つの
Maximaの文字列を生成します. この函数は,sconcat函数と全く同じ定義ですが,唯一の違いが,最
後に答え返す段階で,sconc函数ではMaximaの文字列に変換する函数m-stringを作用させている 点です.
sposition函数は第一引数で指定したMaximaの文字が第二引数の文字列上で何処で最初に表わ
れているかを返す函数です.
(%i67) sposition("c","cCcC");
(%o67) 1
sreverse函数はMaximaの文字列の順番を逆にする函数です.LISPのreverse函数のMaximaへ の実装です.
(%i1) sreverse("うえからよんでも山本山");
(%o1) 山本山もでんよらかえう
sinsert函数は指定した位置に文字列を挿入する函数です.
(%i18) sinsert("、","絶景かな絶景かな",5);
(%o18) 絶景かな、絶景かな
strim函数,striml函数とstrimr函数は共にLISPのstring-trim, string-left-trim,string-right-trim
函数をMaximaに実装した函数です. 共に,第二引数⟨文字列2⟩ から特定の位置にある第一引数
⟨文字列1⟩を除いた文字列を返す函数です.
これらの函数は⟨文字列2⟩に指定した文字列⟨文字列1⟩複数含まれている場合,一つだけを削除 し, 全ての⟨文字列1⟩を削除する事はしません.
先ず,striml函数は ⟨文字列1⟩から開始する文字列⟨文字列2⟩ に対し,⟨文字列1⟩を取り除いた 部分を返します.もし,⟨文字列2⟩が⟨文字列1⟩から開始していない場合には,⟨文字列2⟩をそのま ま返却します.
strimr函数は逆に⟨文字列1⟩を末尾に持つ文字列⟨文字列2⟩に対し,⟨文字列1⟩を除いた頭の部 分を返却します.
strim函数はこれらのstriml函数とstrimr函数の両方の働きをします. 猶,strim("abc","123abc123") を実行すると,真中のabcを抜いた文字列を返すのではなく,”123abc123”をそのまま返却します.
substring函数は与えられたMaximaの文字列から指定した位置のMaximaの文字列を取り出す
函数です.この函数はLISPのsubseq函数のMaximaへの実装になります.
substring函数
¶ ³
substring(⟨文字列⟩,⟨正整数⟩)
substring(⟨文字列⟩,⟨正整数1⟩,⟨正整数2⟩)
µ ´
(%i2) substring("うえからよんでも山本山",9);
(%o2) 山本山
(%i3) substring("うえからよんでも山本山",3,9);
(%o3) からよんでも
split函数
¶ ³
split(⟨文字列⟩)
split(⟨文字列⟩,⟨分離文字⟩) split(⟨文字列⟩,⟨分離文字⟩,false)
µ ´
split函数は与えられた文字列を分解したリストを返す函数です. 猶,切れ目になる文字はデフォ
ルトでは空行(space)ですが,別途指定する事が可能です.又,末尾にfalseを指定した場合,区切文 字が複数存在する場合に,空行を入れたリストを返します.
(%i53) split("first third fourth"," ", false);
(%o53) [first, , third, fourth]
(%i54) split("first third fourth"," ");
(%o54) [first, third, fourth]
simplode函数
¶ ³
simplode(⟨リスト⟩)
simplode(⟨リスト⟩⟨文字列⟩)
µ ´
simplode函数はexplode函数の逆操作の函数で,与えられたリストから文字列を生成する函数
です.
引数がMaximaのリストのみの場合,リストの成分を繋げた文字列を返します. 第二引数として
Maximaの文字列を指定した場合,リストの成分を繋げる際に,第二引数の文字列を間に挿入します.
(%i53) simplode(["12","34","56"]);
(%o53) 123456
(%i54) simplode(["12","34","56"],"*-*");
(%o54) 12*-*34*-*56
この例では,第二引数に何も指定しない場合と,第二引数を指定した場合の違いを示しています.
第二引数を指定しない場合には,単純に文字リストの成分を結合するだけですが,第二引数として
"*-*"を指定すると,第一引数のリストの各成分にこの文字列を挿入している事が判るかと思います.
supcase函数は与えられた文字列に対し,指定された範囲のアルファベットを大文字に変換する
函数で,後述のsdowncaseの逆操作になります.
supcase函数
¶ ³
supcase(⟨文字列⟩)
supcase(⟨文字列⟩,⟨正整数値⟩)
supcase(⟨文字列1⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
(%i44) supcase("this is a pen.",1,1);
(%o44) this is a pen.
(%i45) supcase("this is a pen.",1);
(%o45) THIS IS A PEN.
(%i46) supcase("this is a pen.");
(%o46) THIS IS A PEN.
(%i47) supcase("this is a pen.",5);
(%o47) this IS A PEN.
(%i48) supcase("this is a pen.",1,2);
(%o48) This is a pen.
sdowncase函数は与えられた文字列に対し,指定された範囲のアルファベットを小文字に変換す
る函数です.この函数はsupcaseの逆操作になります.
sdowncase函数
¶ ³
sdowncase(⟨文字列⟩)
sdowncase(⟨文字列⟩,⟨正整数値⟩)
sdowncase(⟨文字列1⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
(%i53) sdowncase("此の猫の名前はMIKEです");
(%o53) 此の猫の名前はmikeです
(%i54) sdowncase("此の猫の名前はMIKEです",9);
(%o54) 此の猫の名前はMikeです
(%i55) sdowncase("此の猫の名前はMIKEです",9,11);
(%o55) 此の猫の名前はMikEです
sinvertcase函数は与えられた文字列に対し,指定された範囲でアルファベットの大小を逆に変換
する函数です.
sinvertcase函数
¶ ³
sinvertcase(⟨文字列⟩)
sinvertcase(⟨文字列⟩,⟨正整数値⟩)
sinvertcasee(⟨文字列1⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
(%i58) sinvertcase("此の猫のnameはMIKEです");
(%o58) 此の猫のNAMEはmikeです
(%i59) sinvertcase("此の猫のnameはMIKEです",5,6);
(%o59) 此の猫のNameはMIKEです
2.9.6 評価函数を利用する文字列操作の函数
tokens函数
¶ ³
tokens(⟨文字列⟩)
tokens(⟨文字列⟩,⟨評価函数⟩)
µ ´
tokens函数は[5]のP.61にあるtokensを取り込んだものです. 評価函数は省略可能ですが,この
場合はconstituent函数が用いられます. この函数は与えられた文字列を分解して,Maximaのリス
トに変換する函数です. この分解で評価函数を用います.具体的には評価函数でTrueになる部分の
みがMaximaのリストの成分として返されます.
(%i79) tokens("MIKEandTAMAand123");
(%i80) tokens("MIKEandTAMAand123",constituent);
(%o80) [MIKEandTAMAand123]
(%i81) tokens("MIKEandTAMAand123",lowercasep);
(%o81) [and, and]
(%i82) tokens("MIKEandTAMAand123",uppercasep);
(%o82) [MIKE, TAMA]
(%i83) tokens("MIKEandTAMAand123",digitcharp);
(%o83) [123]
この例の場合,評価函数を指定しない場合とconstituent函数を指定した時の結果は同じものにな ります.又,lowercasep函数を評価函数として指定した場合, lowercasep函数がtrueを返すandの部 分のみが返却されています.それに対し, uppercase函数を指定すると大文字の部分のみ,digitcharp を指定した場合には,数値の部分のみが返却されています.
ssubstfirst函数は文字列に指定した評価函数に適合する部分文字列が存在する場合に,部分文字
列の入れ替えを行う函数です.
ssubstfirst函数
¶ ³
ssubstfirst(⟨文字列1⟩,⟨文字列2⟩,⟨文字列3⟩)
ssubstfirst(⟨文字列1⟩,⟨文字列2⟩,⟨文字列3⟩,⟨評価函数⟩) ssubstfirst(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩,⟨正整数値⟩)
ssubstfirst(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
名前の通り,評価函数に適合する部分が複数存在する場合には,一番最初の部分が取り換えられ ます.又,評価函数が未指定の場合はsequal函数が用いられます.末尾の正整数値は評価を行う為の 領域の指定を行う為に用いられます.
(%i13) ssubstfirst("三毛","虎","虎猫");
(%o13) 三毛猫
(%i14) ssubstfirst("三毛","虎","虎は虎猫ではない");
(%o14) 三毛は虎猫ではない
(%i15) ssubstfirst("三毛","虎","虎は虎猫ではないが、虎キチでもない", sequal,5);
(%o15) 虎は虎猫ではないが、三毛キチでもない
(%i16) ssubstfirst("三毛","虎","虎は虎猫ではないが、虎キチでもない", sequal,5,9);
(%o16) 虎は虎猫ではないが、虎キチでもない
猶,領域指定の整数を引数として渡す場合には必ず評価函数を記述しなければなりません.
このssubstfirst函数と似た函数で,評価函数に合致する部分を全て入れ替えてしまうのがssubst
函数です.
ssubst函数
¶ ³
ssubst(⟨文字列1⟩,⟨文字列2⟩,⟨文字列3⟩)
ssubst(⟨文字列1⟩,⟨文字列2⟩,⟨文字列3⟩,⟨評価函数⟩) ssubst(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩,⟨正整数値⟩)
ssubst(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
この函数で評価函数を未指定の場合はequalignore函数が用いられます.
(%i19) ssubst("三毛","虎","虎猫");
(%o19) 三毛猫
(%i20) ssubst("三毛","虎","虎は虎猫ではない");
(%o20) 三毛は三毛猫ではない
(%i21) ssubst("三毛","虎","虎は虎猫ではないが、虎キチでもない", sequalignore)
;
(%o21) 三毛は三毛猫ではないが、三毛キチでもない
(%i22) ssubst("三毛","虎","虎は虎猫ではないが、虎キチでもない", sequalignore,5);
(%o22) 虎は虎猫ではないが、三毛キチでもない
(%i23) ssubst("三毛","虎","虎は虎猫ではないが、虎キチでもない", sequalignore,5,9);
(%o23) 虎は虎猫ではないが、虎キチでもない
ssubst函数でも領域指定の整数を引数として渡す場合には必ず評価函数を記述しなければなり
ません.
sremovefirst函数は文字列に指定した評価函数に適合する部分文字列が存在する場合に,その部
分文字列を削除する函数です.
sremovefirst函数
¶ ³
sremovefirst(⟨文字列1⟩,⟨文字列2⟩)
sremovefirst(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩)
sremovefirst(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数3⟩,⟨正整数値⟩) sremovefirst(⟨文字列1⟩,⟨文字列2⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
名前の通り,評価函数に適合する部分が複数存在する場合,一番最初の部分が削除されます.又,評 価函数が未指定の場合はsequal函数が用いられます. 末尾の正整数値は評価を行う為の領域の指 定を行う為に用いられます.
(%i28) sremovefirst("さようなら","さようなら-ああ,さようなら",sequal,5,7);
(%o28) さようなら-ああ,さようなら
(%o29) -ああ,さようなら
(%i30) sremovefirst("さようなら","さようなら-ああ,さようなら",sequal);
(%o30) -ああ,さようなら
(%i31) sremovefirst("さようなら","さようなら-ああ,さようなら",sequal,3);
(%o31) さようなら-ああ,
(%i32) sremovefirst("さようなら","さようなら-ああ,さようなら",sequal,5,7);
(%o32) さようなら-ああ,さようなら
猶,領域指定の整数を引数として渡す場合には必ず評価函数を記述しなければなりません.
sremove函数は文字列に指定した評価函数に適合する部分文字列が存在する場合に,その部分文
字列を全て削除する函数です.
sremove函数
¶ ³
sremove(⟨文字列1⟩,⟨文字列2⟩)
sremove(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩)
sremove(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数3⟩,⟨正整数値⟩) sremove(⟨文字列1⟩,⟨文字列2⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
名前の通り,評価函数に適合する部分が複数存在する場合,全ての部分列が削除されます.又,評 価函数が未指定の場合はsequalignore函数が用いられます.末尾の正整数値は評価を行う為の領域 の指定を行う為に用いられます.
(%i33) sremove("さようなら","さようなら-ああ,さようなら");
(%o33) -ああ,
(%i34) sremovefirst("さようなら","さようなら-ああ,さようなら",sequal,3);
(%o34) さようなら-ああ,
(%i35) sremovefirst("さようなら","さようなら-ああ,さようなら",sequal,3,5);
(%o35) さようなら-ああ,さようなら
猶,領域指定の整数を引数として渡す場合には必ず評価函数を記述しなければなりません.
ssort函数は与えられた文字列を指定した評価函数で大小関係を判別して並び換える函数です.評
価函数が未指定の場合は,clessp函数が用いられます.
ssort函数
¶ ³
ssort(⟨文字列⟩)
ssort(⟨文字列⟩,⟨評価函数⟩)
µ ´
(%i63) ssort("bkavbhjsaAA");
(%o63) AAaabbhjksv
(%i64) ssort("bkavbhjsaAA",cgreaterp);
(%o64) vskjhbbaaAA (%i65) ssort("いろはにほへと",cgreaterp);
(%o65) ろほへはにとい
(%i66) ssort("いろはにほへと",clessp);
(%o66) いとにはへほろ
評価函数をclesspからcgreaterpに変更する事で結果が逆になる事が判ります. 又,日本語も扱 えます.
smismatch函数は二つの文字列を指定した評価函数を用いて比較し,不適合が出る位置を返しま
す.評価函数が未指定の場合,ssequal函数が用いられます.
smismatch函数
¶ ³
smismatch(⟨文字列1⟩,⟨文字列2⟩)
smismatch(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩)
µ ´
(%i72) smismatch("桃も李も桃の内","桃も李も藻も桃も");
(%o72) 5
(%i73) smismatch("1234123","2345123",clessp);
(%o73) 5
(%i74) smismatch("1234123","2345123",cgreaterp);
(%o74) 1
最初の例では評価函数を未指定の為,ssequalが用いられます. その為,両者が初めて異なる藻の 位置が返されています. 次の例では,評価函数をclesspにした場合です.この場合5番目から大小 関係が逆になるので5が返されていますが,最後にcgreaterpを指定すると最初から不適合になる 為,1が返されています.
ssearch函数は第一引数の文字列が第二引数の文字列に含まれる場合に,その開始位置を返します.
又,評価函数を用いて第二引数の文字列の部分列で,第一引数の文字列との関係を満す箇所があれば, その開始位置を返します. 評価函数を指定する場合に限って,評価を行う際の第二引数の文字列の 開始位置や終了位置を指定する事も可能です.又,評価函数が未指定の場合,内部ではsequalignore 函数が用いられています.
ssearch函数
¶ ³
ssearch(⟨文字列1⟩,⟨文字列2⟩)
ssearch(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩)
ssearch(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩,⟨正整数値⟩)
ssearch(⟨文字列1⟩,⟨文字列2⟩,⟨評価函数⟩,⟨正整数値1⟩,⟨正整数値2⟩)
µ ´
(%i1) ssearch("猫","三毛猫と虎猫");
(%o1) 3