- ベストアンサー
文字列の括弧について(初心者)2
文字列の括弧について(初心者) 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
- みんなの回答 (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
その他の回答 (8)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ヘルプはインターネットにつないでいないと見れないんですよね? >間違ってたらすいません。 MSDNライブラリをインストールしてください。 そうしたら、調べたい単語にカーソルをあわせてF1でページが開きます。 >Instr([検索の開始位置, ]検索対象となる文字列式,検索する文字列式[, 文字比較のモードを指定する番号]) >と本に書いてあったのですが、これで正しいのでしょうか? はい、あってます。 >検索の開始位置の部分を変数にしてもよろしいのでしょうか? かまいません。
お礼
アドバイスありがとうございます。 くわしい説明ありがとうございます。 お礼をいうのが遅れて申し訳ありません。
- iridori_rice
- ベストアンサー率37% (3/8)
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を使用しています。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#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
お礼
回答ありがとうございます。 参考にさせていただきます。 お礼をいうのが遅れて申し訳ありません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>文字列の中に指定した文字が何個含まれているか調べて、それぞれ何文字目か示してくれるプログラム '検査する文字が含まれる文字位置を配列で返す 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の方の方法がいいと思います
お礼
回答ありがとうございます。 参考にさせていただきます。 お礼をいうのが遅れて申し訳ありません。
- fortranxp
- ベストアンサー率26% (181/684)
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です。
お礼
回答ありがとうございます。 CStrは文字列のデータ型変換関数でいいのでしょうか? http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_k08.htm はじめて見ました。 このプログラムは括弧のなかに括弧があるときは大丈夫ですが括弧が別々に存在した場合はどうなのでしょうか? 動かしてみたのですが、abc(ads(fs)dfs)asaなどのときは大丈夫なのですが、aafs(eys)eear(hr)sdfのときはうまくいきませんでした。 私のやり方が悪いのかもしれませんがどうか教えてください。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>私はInstrは文字列を左からよんでいって最初にある指定した文字(下記の例だと"("など)の場所を何文字目か示してくれるだけなので1つの括弧にしか対応できないと考えています。 開始位置指定できますけど。 省略しちゃってるから先頭から調べてるだけです。 ヘルプを見てください。
お礼
アドバイスありがとうございます。 毎回、省略して最初から調べていました。 ヘルプはインターネットにつないでいないと見れないんですよね? 間違ってたらすいません。 VBを使っているのはインターネットがつなげないほうのパソコンなので見れないのです。 このページはlynaxのパソコンから見ています。 instrの使い方は Instr([検索の開始位置, ]検索対象となる文字列式,検索する文字列式[, 文字比較のモードを指定する番号]) と本に書いてあったのですが、これで正しいのでしょうか? 検索の開始位置の部分を変数にしてもよろしいのでしょうか? どうか教えてください、おねがいします。
- KamoPlat
- ベストアンサー率46% (23/50)
普通に文字列を一文字ずつ読んでいって「(」があったら「開いている括弧の数」を増やして「)」があったら「開いている括弧の数」を減らしてやってそれが「-1になっていないか」と、文字列の最後まで行ったときに「0になっているか」を検査すればよいのでは? VBの細かい関数思い出せないのでもっと簡単にできるかも知れませんが(汗)
お礼
アドバイスありがとうございます。 laputartさんのプログラムのct1とct2を使って、 If ct1 = ct2 Then Else Msgbox "だめ" というプログラムを入れてみようと思っているのですがどうでしょうか?
- laputart
- ベストアンサー率34% (288/843)
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) には)の文字列番号が入ります。まだエラーとラップとかはしていません。 原始的ですがこういった方法は如何でしょうか。
お礼
回答ありがとうございます。 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/vb_k03.htm
補足
Dim N as integerはいれなくても大丈夫でしょうか?
お礼
回答ありがとうございます。 使わせてもらいました、ありがとうございます。 下記が今のプログラムなのですが、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
補足
申し訳ありません。 捕捉のところに書くべきでした。