プロが教えるわが家の防犯対策術!

文字列の括弧について(初心者)
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1110818
の質問の続きなのですが、
文字列の中で( )を1セットで使う方法を教えてもらったので自分の使用するプログラムに少し直したのですが、やはり2つ以上の括弧(カッコ)にも対応しなければならなくなりました。
どのようなプログラムになるのでしょうか?

私はInstrは文字列を左からよんでいって最初にある指定した文字(下記の例だと"("など)の場所を何文字目か示してくれるだけなので1つの括弧にしか対応できないと考えています。
なので文字列の中に指定した文字が何個含まれているか調べて、それぞれ何文字目か示してくれるプログラムが
あればできると考えています。

どうか教えてください、おねがいします。


↓今のプログラム

Dim bucketL as Long
Dim bucketR as Long
Dim a as String
Dim b as String

a=Text1.text
bucketL = InStr(a, "(")
bucketR = InStr(a, ")")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
Text2.text = "OK"
End If

A 回答 (9件)

折角ですので訂正します。


問題は(や)がある時どのように削除するかですね。
Private Sub Command1_Click()
Dim a As String
Dim i As Integer
Dim j As Integer
Dim k As String
Dim l As Integer
Dim m As String

j = 0
l = 0
a = Text1.Text
For i = 1 To Len(a)
If Mid(a, i, 1) = "(" Then
k = k + "と" + CStr(i)
j = j + 1
ElseIf Mid(a, i, 1) = ")" Then
m = m + "と" + CStr(i)
l = l + 1
End If

Next i
Text2.Text = CStr(j) + "個" + k + "番目"
Text3.Text = CStr(l) + "個" + m + "番目"

End Sub

この回答への補足

申し訳ありません。
捕捉のところに書くべきでした。

補足日時:2004/12/13 22:23
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
使わせてもらいました、ありがとうございます。

下記が今のプログラムなのですが、kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(")のところでエラーがでてしまいます。
私はなぜエラーになったのかよくわかりません。
どうか原因を教えてください。
おねがいします。

Dim a As String
Dim i As Integer
Dim j As Integer
Dim k As String
Dim l As Integer
Dim m As String

a = nyuuryoku

j = 0
l = 0
nyuuryoku = Text1.Text
k = ""
m = ""

For i = 1 To Len(nyuuryoku)
If Mid(nyuuryoku, i, 1) = "(" Then
k = k + "と" + CStr(i)
j = j + 1
ElseIf Mid(nyuuryoku, i, 1) = ")" Then
m = m + "と" + CStr(i)
l = l + 1
End If
Next i

Text2.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目"

jj = 0
ll = 0
kk = ""
mm = ""

For i = 1 To Len(nyuuryoku)
If Mid(nyuuryoku, i, 1) = "[" Then
kk = kk + "と" + CStr(i)
jj = jj + 1

ElseIf Mid(nyuuryoku, i, 1) = "]" Then
mm = mm + "と" + CStr(i)
ll = ll + 1
End If
Next i
Text3.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目"


Dim kakkohajime(50) As Long
Dim kakkoowari(50) As Long
Dim kakkonakami(50) As String


For i = 1 To CStr(j)
kakkohajime(0) = 0
kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(")
Next

For i = 1 To CStr(j)
kakkoowari(0) = 0
kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")")
Next

For i = 1 To CStr(j)
kakkonakami(i) = Mid(nyuuryoku, kakkohajime(CStr(j) + 1 - i), kakkoowari(i))
Next

For i = 1 To CStr(j)
Text4.Text = Text4.Text & "、" & kakkonakami(i)
Next

End Sub

お礼日時:2004/12/13 22:18

>ヘルプはインターネットにつないでいないと見れないんですよね?


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

MSDNライブラリをインストールしてください。
そうしたら、調べたい単語にカーソルをあわせてF1でページが開きます。

>Instr([検索の開始位置, ]検索対象となる文字列式,検索する文字列式[, 文字比較のモードを指定する番号])
>と本に書いてあったのですが、これで正しいのでしょうか?

はい、あってます。

>検索の開始位置の部分を変数にしてもよろしいのでしょうか?

かまいません。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

くわしい説明ありがとうございます。

お礼をいうのが遅れて申し訳ありません。

お礼日時:2004/12/13 22:07

VBのバージョンは何でしょう?


VB5.0以前だと、Split,Replaceは使えないかも...
VB6.0なら、下記のような感じでどうでしょう?

Dim intKakkoNum1 As Integer
Dim intKakkoNum2 As Integer
Dim strText1 As String
Dim strText2 As String

strText1 = "abc"

intKakkoNum1 = UBound(Split(Text1.Text, "("))
intKakkoNum2 = UBound(Split(Text1.Text, ")"))
If intKakkoNum1 <> intKakkoNum2 Then
Text2.Text = "NG!"
Exit Sub
Else
strText2 = Replace(Text1.Text, "(", "")
strText2 = Replace(strText2, ")", "")
If strText1 <> strText2 Then
Text2.Text ="NG!"
Exit Sub
End If
End If

Text2.Text = "OK!"

#上手く関数化すれば、"[","]"等にも対応可能です。

この回答への補足

すいません記述し忘れてました。
VB6.0を使用しています。

補足日時:2004/12/09 02:38
    • good
    • 0

#2様の方針でペアチェックする関数を作りました


-------------------------------------------
Public Function pairCheck(str As String) As Boolean
Dim i, n
n = 0
For i = 1 To Len(str)
Select Case Mid(str, i, 1)
Case "("
n = n + 1
Case ")"
n = n - 1
If n < 0 Then
pairCheck = False
Exit Function
End If
End Select
Next
pairCheck = (n = 0)
End Function
---------------------------------
[]も同様にできますし、同時にやってもいいですね。
使い方
If pairCheck("(a)bc)((((def)))") then
MsgBox "ペアになってますよん"
Else
MsgBox "ペアになってませんよん"
End If
    • good
    • 0
この回答へのお礼

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

お礼をいうのが遅れて申し訳ありません。

お礼日時:2004/12/13 22:06

>文字列の中に指定した文字が何個含まれているか調べて、それぞれ何文字目か示してくれるプログラム


'検査する文字が含まれる文字位置を配列で返す
Public Function charPos(str As String, c As String)
Dim a()
Dim count, i
ReDim a(Len(str))
count = 0
For i = 1 To Len(str)
If c = Mid(str, i, 1) Then
a(count) = i
count = count + 1
End If
Next
ReDim Preserve a(count)
charPos = a
End Function
--------------------------------------
使い方
dim posL,posR,i
posL =charPos("A(BC(DEF(G)))","(")
posR =charPos("A(BC(DEF(G)))",")")
for i=0 to UBOUND(posL) 'UBOUNDで個数がわかる
debug.print posL(i)
next
結果
2
5
9
----------------------------
こういうのより、もともとの目的からすると
#2の方の方法がいいと思います
    • good
    • 0
この回答へのお礼

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

お礼をいうのが遅れて申し訳ありません。

お礼日時:2004/12/13 22:05

Private Sub Command1_Click()


Dim a As String
Dim i As Integer
Dim j As Integer
Dim k As String

j = 0
a = Text1.Text
For i = 1 To Len(a)
If Mid(a, i, 1) = ")" Then
Exit For
End If
If Mid(a, i, 1) = "(" Then
k = k + "と" + CStr(i)
j = j + 1
End If
Next i
Text2.Text = CStr(j) + "個" + k + "番目"

End Sub
左かっこだけですが右かっこも同様ですので
if文の"("と")"を入れ替えればOKです。
    • good
    • 0
この回答へのお礼

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

CStrは文字列のデータ型変換関数でいいのでしょうか?

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
はじめて見ました。

このプログラムは括弧のなかに括弧があるときは大丈夫ですが括弧が別々に存在した場合はどうなのでしょうか?

動かしてみたのですが、abc(ads(fs)dfs)asaなどのときは大丈夫なのですが、aafs(eys)eear(hr)sdfのときはうまくいきませんでした。

私のやり方が悪いのかもしれませんがどうか教えてください。

お礼日時:2004/12/08 18:20

>私はInstrは文字列を左からよんでいって最初にある指定した文字(下記の例だと"("など)の場所を何文字目か示してくれるだけなので1つの括弧にしか対応できないと考えています。



開始位置指定できますけど。
省略しちゃってるから先頭から調べてるだけです。
ヘルプを見てください。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

毎回、省略して最初から調べていました。

ヘルプはインターネットにつないでいないと見れないんですよね?
間違ってたらすいません。

VBを使っているのはインターネットがつなげないほうのパソコンなので見れないのです。
このページはlynaxのパソコンから見ています。

instrの使い方は
Instr([検索の開始位置, ]検索対象となる文字列式,検索する文字列式[, 文字比較のモードを指定する番号])
と本に書いてあったのですが、これで正しいのでしょうか?

検索の開始位置の部分を変数にしてもよろしいのでしょうか?
どうか教えてください、おねがいします。

お礼日時:2004/12/08 17:59

普通に文字列を一文字ずつ読んでいって「(」があったら「開いている括弧の数」を増やして「)」があったら「開いている括弧の数」を減らしてやってそれが「-1になっていないか」と、文字列の最後まで行ったときに「0になっているか」を検査すればよいのでは?


VBの細かい関数思い出せないのでもっと簡単にできるかも知れませんが(汗)
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

laputartさんのプログラムのct1とct2を使って、

If ct1 = ct2 Then
Else
Msgbox "だめ"

というプログラムを入れてみようと思っているのですがどうでしょうか?

お礼日時:2004/12/08 17:49

Dim N as integer


Dim a(9),b(9) as integer
Dim ct1, ct2 as integer
Dim Z as string

'text1をZに置く
Z=Text1.text
' Ln=文字列Zの長さ
Ln=Len(Z)

ct1=0:Ct2=0
'ct1とct2はそれぞれ (と)の数

for I=1 to Ln
If Mid(Z,i,1)="(" then
Ct1=ct1+1
a(Ct1)=I
Elseif Mid(Z,i,1)=")" then
Ct2=ct2+1
b(Ct2)=I
End If
next I

Msgbox("(の数は" & ct1 & "個です。")
Msgbox(")の数は" & ct2 & "個です。")

End Sub

a(1) a(2) には(の文字列番号が入ります。

b(1) b(2) には)の文字列番号が入ります。まだエラーとラップとかはしていません。
原始的ですがこういった方法は如何でしょうか。

この回答への補足

Dim N as integerはいれなくても大丈夫でしょうか?

補足日時:2004/12/08 18:08
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
bucketL = InStr(a, "(")
bucketR = InStr(a, ")")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
と、このプログラムを組み合わせればできそうです。
しかし、私はfor文の使い方がよくわかっていないのでうまくいきません。
nextに対応するforがありませんと出てしまいます。

↓プログラムの1部分

For i = 1 To Ct1
ここにいろいろプログラムをいれます。
next i
Msgbox"OK"

上の例だとエラーがでます、原因はなんでしょうか?
どうか教えてください、おねがいします。


このページのforの説明を見ながらやっているのですが、原因がよくわかりません。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …

お礼日時:2004/12/08 17:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!