• ベストアンサー

(aaa/bbb/○○)を、(××)に書き換えたい。

いつもお世話になっております。 開発環境:VisualBasic6.0 Windows2000 開発者レベル:プログラム初心者 文字列の入替について質問させて下さい。 元ネタ--------------------------- あああ,いいい ううう,えええ  ・  ・    ←間400行くらい  ・ %なんとかかんとか (H:/jlih/79057908423/jsglk/jklfsa/あああ) kkk { % ppp ggg (H:/jlih/79057908423/jsglk/jklfsa/あああ) mm }  ・  ・    ←間、何百行か  ・ (H:gds/grehe/79805423/hter/bhgs/ううう) kkk { % ppp ggg (H:gds/grehe/79805423/hter/bhgs/ううう) mmm } /元ネタ--------------------------- ↓やりたい結果↓ 完成--------------------------- あああ,いいい ううう,えええ  ・  ・    ←間400行くらい  ・ %なんとかかんとか (いいい) kkk { % ppp ggg (いいい) mm }  ・  ・    ←間、何百行か  ・ (えええ) kkk { % ppp ggg (えええ) mmm } /完成--------------------------- ユニークである「あああ」で検索して、 その行以下で見つかった「あああ」を含む()内の 全部を、「いいい」に書き換えたいのです。 Split関数で「,」を境に 「あああ」と「いいい」の左右を分解して 配列に格納する・・まで出来ましたが、 その後の置換で煮詰まっております。 自分で考えたのが、 (1)Replace関数で、 検索文字列を「(*あああ)」とかにして、 ワイルドカードを使用する。 しかし →ワイルドカード使用が上手くいかない上に、  この動作は置換ではなさそうな気がしてきた。  ex: 置換後=Replace("(*)","(*あああ)","(いいい)") (2)ユニークである「あああ」から、 InstrRev関数を使って「(」までのByte数を数えて、 丸ごと切り取り&代入する。 しかし →アナログすぎる気がした。 上の様な動作をさせる場合、 どのような流れで作るのが良いか、 もし良ろしければご意見を聞かせて頂けますでしょうか。 プログラム初心者の私が、 自分なりの狭い了見で考え、調べましたが、 ちょっと煮詰まっております。 文章に不足やお見苦しい点がございますことをお詫びいたします。 よろしくお願いいたします。

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

例えば正規表現 VB6.0で正規表現を使う http://cheb.sakura.ne.jp/gena/blog/archives/2006/03/vb60.html を使用してみると、 Private Sub Command1_Click()  Dim RegExp As New RegExp  Dim st(1) As String  Dim ss(1) As String  Dim tt(1) As String  Dim i As Integer  Dim j As Integer  st(0) = "(H:/jlih/79057908423/jsglk/jklfsa/あああ) kkk "  st(1) = "(H:gds/grehe/79805423/hter/bhgs/ううう) kkk"  ss(0) = "あああ"  ss(1) = "ううう"  tt(0) = "いいい"  tt(1) = "えええ"  For i = 0 To 1      For j = 0 To 1          RegExp.Pattern = "\(.*/" & ss(j) & "\){1}"          If RegExp.Test(st(i)) Then             Debug.Print st(i), RegExp.Replace(st(i), "(" & tt(j) & ")")          End If      Next  Next  Erase st, ss, tt End Sub こう言った感じになったりもします。

0896
質問者

お礼

正規表現というものの存在を初めて知りまして、 概念の勉強をしておりました。 お礼が遅くなってすみません。 書いていただいたサンプルをベースに試行錯誤を繰り返し、 とうとうやりたい結果が得られるようにまでなりました。 本当にありがとうございます。

その他の回答 (1)

  • roze_mt5
  • ベストアンサー率0% (0/1)
回答No.2

参考意見程度ですが、今回のケースでは多少アナログなソースになってしまうのは仕方がないのではないかと思います。 私もVisualBasic6.0での開発経験が長いわけではありませんが、スマートに書けるような関数が思いつきませんでした。 私であればこう書くかな・・・というサンプルを以下に記載します。 解決の糸口となれば幸いです。 ※変換対象を1行ずつTestFunctionで変換するようなイメージです ※()が複数ある場合等の例外処理は割愛しています Private pstrCnvChar(1) As String '変換対象の格納配列 Private Function TestFunction(ByVal strChar As String) As String   Dim strResult As String   Dim strChkChar As String   Dim lngCnt As Long   Dim lngStart As Long   Dim lngEnd As Long   strResult = strChar   '()の位置を判定------------------------   lngStart = 0   lngEnd = 0   For lngCnt = 1 To Len(strChar)     Select Case Mid$(strChar, lngCnt, 1)     Case "("       lngStart = lngCnt     Case ")"       lngEnd = lngCnt       If lngStart > 0 Then         Exit For       End If     Case Else     End Select   Next lngCnt   '--------------------------------------   '()内に文字列があったら変換チェック----   If (lngStart > 0) And ((lngStart + 1) < lngEnd) Then     strChkChar = Mid$(strChar, lngStart + 1, lngEnd - lngStart - 1)     '一致する文字列が存在すれば変換処理     If InStr(strChkChar, pstrCnvChar(0)) > 0 Then       strResult = Replace$(strChar, strChkChar, pstrCnvChar(1))     End If   End If   '--------------------------------------   TestFunction = strResult End Function

0896
質問者

お礼

すべてをパッと解読、連想できるほどの技術はないのですが、 サンプルをじっくり読ませて頂く過程が物凄く勉強になりました。 回答して下さいまして 本当にありがとうございます。

関連するQ&A

専門家に質問してみよう