- ベストアンサー
(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数を数えて、 丸ごと切り取り&代入する。 しかし →アナログすぎる気がした。 上の様な動作をさせる場合、 どのような流れで作るのが良いか、 もし良ろしければご意見を聞かせて頂けますでしょうか。 プログラム初心者の私が、 自分なりの狭い了見で考え、調べましたが、 ちょっと煮詰まっております。 文章に不足やお見苦しい点がございますことをお詫びいたします。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
例えば正規表現 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 こう言った感じになったりもします。
その他の回答 (1)
- roze_mt5
- ベストアンサー率0% (0/1)
参考意見程度ですが、今回のケースでは多少アナログなソースになってしまうのは仕方がないのではないかと思います。 私も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
お礼
すべてをパッと解読、連想できるほどの技術はないのですが、 サンプルをじっくり読ませて頂く過程が物凄く勉強になりました。 回答して下さいまして 本当にありがとうございます。
お礼
正規表現というものの存在を初めて知りまして、 概念の勉強をしておりました。 お礼が遅くなってすみません。 書いていただいたサンプルをベースに試行錯誤を繰り返し、 とうとうやりたい結果が得られるようにまでなりました。 本当にありがとうございます。