• ベストアンサー

TCL言語で文字列検索方法を教えてください。

こんにちは TCL初学者です。 romは複数出てくる場合あり。 ある配列に ******rom****** という文字列があります *:は任意の数字や文字や記号です。 romという並びを見つけたらFLAG=1 romという並びが無ければFLAG=0 のような関数を作るのはどうしたらよいでしょうか? C言語やPASCALなら読めます。 ただTCLで記述した事が無いので、想像が出来ません よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

$tclsh % set str {gasgsagsdagaromdfgagasdfgf} gasgsagsdagaromdfgagasdfgf % set flag 0 0 % echo $flag 0 % set flag [ regexp "rom" $str ] 1 % echo $flag 1 「配列」がTclでいうところの array なのか list なのか わかりませんが、 ある文字列を含むかどうかは上のような判定ができます。 しかしTclとはどマイナーなものが。

masato0703
質問者

お礼

自分なりに 書いてみました。 set elem_name_len [string fist rom [get_arry Table::elem name] if {$elem_name_len > 0}{ set flag 1 } else { set flag 0 } はいかがでしょうか? あっていたら、ありがとうございます。

masato0703
質問者

補足

ご回答ありがとうございます。 配列はarrayです。 string first $rom $*******rom***** という書き方はだめですか? [get_arry Table:element name] のelement nameに*******rom*****が入っています。 いかがでしょうか?

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

regexp を使った正規表現マッチングだと、 たとえば regexp "roo?m" $str とすると、rom か room を含んでいるかどうかという 判定が可能ですが、 string firstではこれはできません。 今回検索すべきものは複雑なパターンではなく単純な文字列なので、 string first でも問題ないし、逆に固定文字列を 検索するための最適化が行われていることも 期待できるので、速度的には有利だろうということです。 string first だと、メタ文字も単なる普通の文字と 見なすだけの話ですので上述のような複雑(かもしれない)パターンで 検索するのでなければ気にすることはありません。 逆にそのようなパターンを探すのにはstringは使えません。

masato0703
質問者

お礼

大変ありがとうございました。 TCLをいろいろ見てると、Cより簡単な面もあるけど 正規表現とか、複雑ですね。 とても勉強になりました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

array/list の要素をすべて舐めていくかと思ったのですがちがったのですか。 正規表現マッチングだと結果が 0/1になるので#1の回答で使いましたが、 自分で1/0を設定するからどう言う値でも良いということなら、 string first のほうが良いと思います。 正規表現のメタ文字がないのに正規表現マッチングをするよりは単純に 検索したほうが多少は早いでしょうし。

masato0703
質問者

お礼

おはようございます . ^ $ [ ] * + ? | ( ) がメタ文字で、正規表現では このれらの文字の前にに¥を付けないといけない事がわかりました。 stringではメタ文字は対応しませんか? そうすると#1の書き方の方がベストでしょうか? 1/0の設定は自分でかけます。 ご指導お願いいたします。

masato0703
質問者

補足

ご回答ありがとうございます。 さっそく本日WSにてやってみます。 >正規表現マッチングだと結果が 0/1になるので#1の回答で使いましたが、 >正規表現のメタ文字がないのに正規表現マッチングをするよりは単純に検索したほうが多少は早いでしょうし。 この表現私にとって理解不能な言葉なので、噛み砕いて説明していただくと助かります。

関連するQ&A

  • TCL言語の文字コード指定方法

    UNIX環境にて、OS時間を以下のフォーマットで 出力したいと考えています。 YYYY/MM/DD hh時mm分ss秒 ファイル出力の関数はTCL言語にて実装しています。 上記の関数をC言語で実装した関数より呼び出します。 ファイルを出力した際、出力結果にて日本語部分が 文字化けしてしまいます。 OS時間の取得はTCL関数内で実施しています。 文字コードをうまく設定できていないのだと思うのですが、 ファイル出力関数を呼び出す関数側(C言語で実装している関数側)にて、 文字コードを指定する方法をご存知の方はいらっしゃいませんでしょうか? よろしくお願い致します。

  • 文字列について

    昨日以下の質問をしました初心者ですが、 今自分で関数を作成しているのですが、文字列(丸数字)の文字化けにかなり苦しんでいます。 (※注※)これ以降(1)など()の中に数字を入れて記述しているものは実際のソースコード上では丸数字で記入してます。教えてgooでは丸数字が記述できないようでして… 関数の内容としては、(1)あ(2)い(3)う……このように丸数字で区切られている文字列を配列名を$dataとすると、$data[0]には「あ」、$data[1]には「い」、$data[2]には「う」が入るような関数を作成しています。 この丸数字の数は(10)まで対応させようと考えてます。 という質問をしましたが、この問題に関しては、 function bunkai($str1){ $data=explode('__SEPRATOR__',str_replace(Array("(1)","(2)","(3)","(4)","(5)","(6)","(7)","(8)","(9)","(10)"),'__SEPRATOR__',$str1)); array_shift($data); return $data; } と記述することのより解決しました。 しかし、昨日の質問を少し僕が間違えていたようで、実際には、$data[0]には「(1)あ」、$data[1]には「(2)い」、$data[2]には「(3)う」が入るような関数を作成したかったのです。で、試行錯誤しようにも方法が思いうかびませんでした。何か良い方法はないでしょうか?? ちなみに文字列は(1)あ(2)い(3)う……のように(1)から順番に始まるものもあれば(3)え(4)う…と(1)ではなく途中から始まるものもあります、なので、配列の順番を取ってきてそのまま丸数字に置き換えて挿入するという方法はダメです。 誰か文字列操作に詳しいお方、教えてもらえたらうれしいです。

    • ベストアンサー
    • PHP
  • pascal言語

    pascal言語のことで質問があります。 いくつかの整数を入力した際に、その数字が入力された 回数を記憶しておくプログラムを書きたいのですが、全く分かりません。配列を使えばいいのでしょうか? 教えてください。

  • c言語の文字列出力

    プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

  • 配列型の数字データをint型に変える方法

    こんばんは。 C言語を勉強しているのですが、わからない事が有り投稿しました。 atoi関数と同じような関数を作ろうとして、配列の中の 数字を取り出し、関数内の別配列に収めたのですが、これをint型としてmainに戻す場合どのようにして型変換をしたらよいのかわかりません。 (取り出した数字の並びはそのままで) 何か方法をご存知の方がいましたら、回答をお願いします。

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • C言語に関する質問

    C言語を独学で学んでいる者です。 配列に10桁の文字を格納して、そこから任意の1文字を探し出す(何番目に何の文字があると表示する)プログラムを作ってみたいのですが、どのように記述したらよいか分かりません。特に、10桁の文字列に同じ文字が複数含まれる場合は完全にどうしたら良いのかわからない状態です。 お分かりの方は、ぜひご教授願います。

  • 文字列についていい方法はありますか?

    マイコンでプログラムを作っています。 配列aに文字を入力し、それを7セグに表示したいです。 表示自体は出来ています。 なので、文字列を配列に入力する方法を教えてください。 (数字以外を表示します。) まず、現在は char *a[6]; a[0]="12345"; seg(*a);//7セグ表示用関数 このようなソースを書きました。これは希望通りの動作してます。 しかし、例えば a[0] = "12"; a[2] = "345"; や、 a[0] = "12" + "345" のように、文字列どうしをくっつけるような使い方が出来ないものかと悩んでいます。 最悪の場合 char a[5]; a[0] = '1'; a[1] = '2'; a[2] = '3'; a[3] = '4'; a[4] = '5'; と、このような方法を使おうと思ってますが、あまり好きじゃないです。 出来ないのは無知なせいなのか、方法は有るが最後の方法が一番マシなのか、もっといい方法があるなら何を使えばいいのか、等アドバイスをお願いします。 よろしくお願いします。

  • カンマの含まれる文字列の数値変換方法について

    VB.NETでプログラミングしています。 String型の文字列を Double型の数値に変換するときに 一般的にはVal関数を使いますが、 カンマが含まれる文字列"111,111"を 数値変換したい場合には単純にVal関数を 使用しただけではうまくいかないようです。 上の例で数値変換すると"111"になってしまうようです。 そこで質問なのですが、 何か簡単にできるうまい方法はないでしょうか? 関数があればご教示ください。 以下、Val関数の説明の抜粋です。 解説 文字列中に数字以外の文字が見つかると、Val 関数は読み込みを中止します。円記号 (\) やカンマ (,) など、通常は数値の一部と見なされる記号や文字も、Val 関数は数値として解釈しません。

  • 文字列圧縮_

    .  JavaScriptで関数をつくって,全角記号等を含む文字列を,最大限に圧縮するには,どのように記述すればよいでしょうか。  ただし,圧縮後の文字列は,URIencodeしても変化しない,つまりURIに直接挿入できる文字列で,また,http://d.hatena.ne.jp/elm200/?date=20080211&section=1202730571 のように,最終的に ('')内に文字列を入れる事で圧縮できる形態のものとします。 .

専門家に質問してみよう