こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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を出力します。

出力のメッセージはメッセージボックスを使おうと思っています。
基本的な質問かもしれませんがどうか教えてください。
よろしくおねがいします。

投稿日時 - 2004-11-16 15:35:13

QNo.1087027

すぐに回答ほしいです

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

#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
の様に呼び出すことになります。
参考になれば

投稿日時 - 2004-11-18 18:17:36

お礼

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

投稿日時 - 2004-11-24 15:33:02

ANo.10

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.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

投稿日時 - 2004-11-18 19:31:02

お礼

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

投稿日時 - 2004-12-01 23:35:39

ANo.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"

投稿日時 - 2004-11-18 16:42:58

補足

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

投稿日時 - 2004-12-01 23:36:40

お礼

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

ありがとうございました。

投稿日時 - 2004-12-01 23:34:58

ANo.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"
'--------------------------------------------------------

こんな感じになりましたがどうでしょうか??
的を得ていたら良いのですが...

投稿日時 - 2004-11-18 16:24:51

ANo.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")になるまで数字を足せば、次の文字コードを作り出すことができます。

投稿日時 - 2004-11-18 01:12:24

お礼

詳しく説明してくれてありがとうございます。
しかしまだ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でもよいのでどうか教えてください。

質問ばかりで申し訳ありません。
上記のプログラムが分かれば文字の集合を数字の集合として設定できると思うので、自分のプログラムにもいかせると思います。

投稿日時 - 2004-11-18 14:50:03

ANo.6

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

投稿日時 - 2004-11-17 18:51:17

お礼

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

投稿日時 - 2004-11-18 14:21:06

ANo.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

投稿日時 - 2004-11-17 18:46:51

お礼

解答ありがとうございます。

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

投稿日時 - 2004-11-17 22:36:22

ANo.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文でのチェックになるのではないかなぁ???

投稿日時 - 2004-11-17 15:17:14

お礼

解答ありがとうございます。
集合の表現が悪かったのですね。
B="abcdef"でおねがいします。

もうひとつ質問なのですが
B="abcdef"はB="a-f"と書けるのですか?
mid関数というものはある文字列から、x番目の文字列をy文字分抜き出すというものですよね。
yは2でxはiなのですか?

投稿日時 - 2004-11-17 17:25:01

ANo.3

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

あと、確認したいのは、文字列を集合を保持しているとするのかということ。

投稿日時 - 2004-11-16 17:58:07

補足

解答ありがとうございます。
申し訳ありません、私の説明が悪かったです。
もう一度書き直してみます。

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さん深く考えもせずお礼をいってしまってすいませんでした。

投稿日時 - 2004-11-17 14:25:18

お礼

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

投稿日時 - 2004-11-17 14:50:05

ANo.2

たぶんこれで良いと思うが...

x = InStr(a, b)
If x = 0 Then
MsgBox "含まれない"
Else
MsgBox "含まれる"
End If

間違っていたらすいません

投稿日時 - 2004-11-16 15:50:14

お礼

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

投稿日時 - 2004-11-16 17:13:40

ANo.1

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

投稿日時 - 2004-11-16 15:49:18

お礼

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

投稿日時 - 2004-11-16 17:16:38

あなたにオススメの質問