• ベストアンサー

文字列に含まれる文字列の判定について(?)(初心者)

A、Bという文字列があるとしてBがAに含まれると1を出力 、BがAに含まれないと0を出力するプログラムを作りたいのですが、どういうプログラムを書けばいいのかわかりません。 例   A=(a1,a2,a3) B=(a1,a2) 上記のA,Bという集合があるとして、BはAに含まれるので1を出力します。 A=(a1,a2,a3) B=(a4,a5) 上記のA,Bという集合があるとして、BはAに含まれるので0を出力します。 出力のメッセージはメッセージボックスを使おうと思っています。 基本的な質問かもしれませんがどうか教えてください。 よろしくおねがいします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.10

#7> (A,B,C)を(65,66,67)に変換       ↓ syugou = (65,66,67)に設定 上記のような流れはプログラムでどのようにするのでしょうか? 文字の集合を数字の集合として設定できる ------------------------------------------------- 上記のsyugouというのを何で表すか、ということで変わってくると思います。 #5のプログラムでは、また文字列に(ChrWで)戻しています。 数値で表すということであれば、配列を使うということになるのでしょうね。 VBでは、 dim syugou(256) as long の様に宣言して syugou(0)=65 syugou(1)=66 syugou(2)=67 の様に格納し if 65=syugou(0) then の様に呼び出すことになります。 参考になれば

gosutero
質問者

お礼

ありがとうございます。 このくわしい説明で理解できました。

その他の回答 (10)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.11

いわゆる正規表現で出来ます。 Function IsAtoF(ByVal s As String) As Boolean IsAtoF = Not (s Like "*[!A-F]*") End Function

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=434913
gosutero
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

  • _tomo_
  • ベストアンサー率28% (2/7)
回答No.9

No.8ですが一部誤りがありましたので 修正します ---------------------------------------------------------- Dim i As Long 'カウンタ変数 Dim FLG As Boolean FLG = True For i = 1 To Len(A)   If InStr(B, Mid(A, i, 1)) = 0 Then     '文字列Aは文字列Bに存在しない文字を含んでいる     MsgBox "0"     FLG = False     Exit For   End If Next '文字列Aは文字列Bに存在する文字しか含まない If FLG Then MsgBox "1"

gosutero
質問者

お礼

お礼を言うのが遅れて申し訳ありません。 このプログラムを使わせていただきます。 ありがとうございました。

gosutero
質問者

補足

最後にEnd ifをいれたほうがいいのでしょうか? 自分のプログラムに組み込んだらいれなさいって警告がでました。

  • _tomo_
  • ベストアンサー率28% (2/7)
回答No.8

No2のものです 気になったので私も作成してみました '-------------------------------------------------------- Dim i As Long 'カウンタ変数 Dim FLG As Boolean FLG = True For i = 1 To Len(B) If InStr(B, Mid(A, i, 1)) = 0 Then '文字列Aは文字列Bに存在しない文字を含んでいる MsgBox "0" FLG = False Exit For End If Next '文字列Aは文字列Bに存在する文字しか含まない If FLG Then MsgBox "1" '-------------------------------------------------------- こんな感じになりましたがどうでしょうか?? 的を得ていたら良いのですが...

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#5>Boolean,pos,ret,astring,AscWなどはどういう意味のプログラムなのですか? >astringはstringとは違うのでしょうか? まず、dim の並びに書かれている名前は、この変数を使いますよという宣言です。 変数には、変化する値(数字や文字列など)を入れます。 aStringは、 dim aString as String と書いてありますので、 Stringとして使用する変数ですよという意味です。 この場合Stringは型でaStringは変数の名前です。 作業用に使う文字列というだけで特にそれ以上の意味はないです。 pos,retも同じく変数で posは、文字列の中での文字位置を保持するために使っています。 retは、関数自体の値を保持するものです。 Booleanも型で、true,Falseのどちらかの値をとります。 IFの条件部分などで使うと成立、不成立を表します。 if 5=5 THEN と if true THEN は、同じ意味になります。 AscWは、文字をUNICODEで文字コードに表す値を返す関数です。 この問題で "A-E"などで範囲を表すために "A-E"を"ABCED"に変換しなければなりませんが、 "A"とか、文字のままでは計算できません。 ASC("A")などとすることでその文字コード65を取り出すことができます。 文字コードは、基本的に並びになっているので、文字コードASC("E")になるまで数字を足せば、次の文字コードを作り出すことができます。

gosutero
質問者

お礼

詳しく説明してくれてありがとうございます。 しかしまだNo.5のプログラムが完全には理解できません。 aStringやpos,retは自分で決めた変数の名前だったのですね。 ASCは文字をアスキーコードの数字に変換しているということなのですね。 >"A-E"などで範囲を表すために >"A-E"を"ABCED"に変換しなければなりませんが、 >"A"とか、文字のままでは計算できません。 これはBとCとDにもアスキーコードが設定されているからということなんですね。 ただいまアスキーコードについて調べているのですが、検索してもアスキーコード表ばかりひっかかってしまいます。 (A,B,C)などの集合をアスキーコードに変換して、ひとつの値にまとめるというやり方はどのように行うのでしょうか? (A,B,C)はアスキーコードに変換すると(65,66,67)なんですよね? (A,B,C)を(65,66,67)に変換       ↓ syugou = (65,66,67)に設定 上記のような流れはプログラムでどのようにするのでしょうか? 説明してあるHPでもよいのでどうか教えてください。 質問ばかりで申し訳ありません。 上記のプログラムが分かれば文字の集合を数字の集合として設定できると思うので、自分のプログラムにもいかせると思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

うぎゃ! compareIgnore→ignoreCase code = Mid(child, pos, 1) 不要 訂正します

gosutero
質問者

お礼

お礼をいうのが遅れてしまい申し訳ありませんでした。 No.5にわざわざプログラムを書いていただき本当に感謝しています。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

'作ってみました '使い方 'if isInclude("abced","bd") then MsgBox 1 else MsgBox 0 'isInclude("a-d","ad") →true 'isInclude("A-D","ad") →false 'isInclude("A-D","ad",ignoreCase:=true) →true 'isInclude("AbD","BD",true) →true 'isInclude("あ-お","あお")→true 'isIncludeは、文字列を集合と見立ててその要素(文字)が含まれているかを判断する 'mother には、"a-z"のような表記を許す 'compareIgnore をtrue で指定した場合は文字の比較で大文字小文字を同一視する、初期値は、同一視しない Function isInclude(mother As String, child As String, Optional ignoreCase As Boolean = False) As Boolean Dim cLen, pos, ret Dim aString As String, makeString As String, replaceString As String Dim startCode, endCode, code aString = mother pos = InStr(mother, "-") Do Until pos = 0 replaceString = Mid(aString, pos - 1, 3) startCode = AscW(Mid(aString, pos - 1, 1)) endCode = AscW(Mid(aString, pos + 1, 1)) makeString = "" For code = startCode To endCode makeString = makeString & ChrW(code) Next aString = Replace(aString, replaceString, makeString) pos = InStr(aString, "-") Loop If ignoreCase Then aString = UCase(aString) child = UCase(child) End If cLen = Len(child) ret = True For pos = 1 To cLen code = Mid(child, pos, 1) If InStr(aString, Mid(child, pos, 1)) = 0 Then ret = False: Exit For Next isInclude = ret End Function

gosutero
質問者

お礼

解答ありがとうございます。 Boolean,pos,ret,astring,AscWなどはどういう意味のプログラムなのですか? astringはstringとは違うのでしょうか? 自分の使っている本には載ってなかったので使用例などが書いてあるサイトなど があったら教えてください どうかおねがいします

  • kachimi
  • ベストアンサー率40% (12/30)
回答No.4

#3さんが言われているようにBというのを集合と表現するのがまずいのではないでしょうか? B="abcdef"なのか B(0)="a" B(1)="b" B(2)="c" B(3)="d" B(4)="e" B(5)="f" なのかをまずはっきりさせて頂けますでしょうか? 上記の例だと InStr(mid(A,i,1),B)でAの個数分繰り返してチェックすれば出来るでしょうし、 下記の例だと mid(A,i,1) = B(j)でIF文でのチェックになるのではないかなぁ???

gosutero
質問者

お礼

解答ありがとうございます。 集合の表現が悪かったのですね。 B="abcdef"でおねがいします。 もうひとつ質問なのですが B="abcdef"はB="a-f"と書けるのですか? mid関数というものはある文字列から、x番目の文字列をy文字分抜き出すというものですよね。 yは2でxはiなのですか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

質問文は、文字列が含まれるか? だけど、例は集合になっているので、 どういうことなのか、補足して欲しい。 例えば、instr関数は、 "ABCD"に"BC"は見つけるけど "AD"は見つけられません。 単純にinstrではだめなのではないかと想像するが… あと、確認したいのは、文字列を集合を保持しているとするのかということ。

gosutero
質問者

お礼

細かい指摘ありがとうございます。 長い補足になってしまいましたがどうかおねがいします。

gosutero
質問者

補足

解答ありがとうございます。 申し訳ありません、私の説明が悪かったです。 もう一度書き直してみます。 Aがその都度、自分で設定する入力のようなもので2文字からなる文字列を入力します。 例 A=ab(aとbは普通の文字です、変数ではありません) そしてBがはじめから決定している文字の集合です。 例 B=(a,b,c,d,e,f,g)(上と同様にそれぞれ普通の文字です、変数ではありません) そしてBの中から文字を2つ選び、文字列を作り、それがAと同じならメッセージボックスで1と出力するプログラムです。 上の2つの例を使うと A=ab B=(a,b,c,d,e,f,g) この場合Bからaとbという文字を選びabという文字列ができるのでメッセージボックスに1と表示されます。 例2 A=ad B=(a,b,c,d,e,f,g) (これも上と同様にa,b,c,d,e,f,gは変数ではなく普通の文字です) この場合もBからaとdという文字を選びadという文字列ができるのでメッセージボックスに1と表示されます。 例3 A=cj B=(a,b,c,d,e,f,g) (これも上と同様にa,b,c,d,e,f,g,jは変数ではなく普通の文字です) この場合はBからcは選ぶことができますが、jはないのでcjという文字列を作ることができないのでメッセージボックスに0と表示されます。 いろいろとわかりにくいと思いますがどうかおねがいします。 tomoさん、kachimiさん深く考えもせずお礼をいってしまってすいませんでした。

  • _tomo_
  • ベストアンサー率28% (2/7)
回答No.2

たぶんこれで良いと思うが... x = InStr(a, b) If x = 0 Then MsgBox "含まれない" Else MsgBox "含まれる" End If 間違っていたらすいません

gosutero
質問者

お礼

早い解答ありがとうございました。 プログラムまで詳しくかいてくれてありがとうございます。 これでやってみます。

  • kachimi
  • ベストアンサー率40% (12/30)
回答No.1

a1にa4の文字列が含まれる? というのであればInStr()関数を使用すれば可能です。InStr関数が位置を表す数値を返却するので0でなければ1を返すようにすればいいです。 a1=a4(文字列が同じ)? であればIF文でOK Aの集合が配列ならUBOUND(A)でAの配列数が求まるので(Bの集合も同様)ループで検査すれば可能ではないでしょうか。

gosutero
質問者

お礼

早い解答ありがとうございました。 同じじゃなくて含まれるほうなので上の方法でやってみます。 詳しい説明ありがとうございました。

関連するQ&A