RichTextBoxで色を置換

解決


あや  2004-01-19 16:59:38  No: 111405  IP: [192.*.*.*]

はじめまして。
RichTextBoxでの処理ができなくて困っております。
正規表現で指定したものだけを赤くするというような事をしたいのですが、やり方が分かりません。
例えば「abcdueosobidgrkebadfe」の中で「b.?d」で検索すると
bcd bid bad  だけが赤になるという処理をしたいのです。
良いやり方があれば教えてください。

編集 削除
特攻隊長まるるう  2004-01-19 17:42:59  No: 111406  IP: [192.*.*.*]

1、正規表現の検索の仕方
2、RichTextBox の色を置換
(3、RichTextBox で実装(クラス化?))
…全部分からないですか?。

あと、VB.NET なら Regex クラスを使ってすぐできそうですが
VB.6.0 だと…ボクはやったことなかったりします…
環境も明記してください。

編集 削除
あや  2004-01-19 19:12:36  No: 111407  IP: [192.*.*.*]

不十分な記述ですみません。
使っているのはVB6.0です。
正規表現で文字を置換することはできるのですが、
検索はExecuteを使うのでしょうか。多分分かると思います。

RichTextBoxに色をつけた文字を置くのは分かるのですが、
2,3の置換と実装というのは分かりません。
宜しくお願いします。

編集 削除
特攻隊長まるるう  2004-01-19 19:55:55  No: 111408  IP: [192.*.*.*]

色を変えるだけなら簡単だからねぇ。
[VB6.0]
Private Sub Command1_Click()
    With Me.RichTextBox1
        .Text = "012345678901234567890"
        .SelStart = 3
        .SelLength = 4
        .SelColor = vbRed
    End With
End Sub

あとは色を変える文字の位置と長さが分かればいいわけです。
正規表現の検索ができるなら、あとは文字列操作関数使えば…
検索で引っかかった文字の InStr とか?
…同じ文字の2回目の出現も気にしてね?

編集 削除
たかみちえ  URL  2004-01-19 22:12:29  No: 111409  IP: [192.*.*.*]

わたしは書式付きテキスト(RTF)は、WinHelpの作成でちょこっとふれただけですけど…。
  正規表現で置き換えるとき、タグ({\b }とか)を付加してみては?
リッチエディットボックスの扱いはよく覚えていませんが、確かリッチエディットの内部の書式付きテキストを、直接取得・編集することはできましたよね?
それを使って正規表現置き換えをすれば、可能なのではないかと思いますが。

編集 削除
特攻隊長まるるう  2004-01-20 00:22:13  No: 111410  IP: [192.*.*.*]

うむうむー。RTF使いたかったら過去ログをRTFで検索してみてー。

編集 削除
あや  2004-01-20 01:49:38  No: 111411  IP: [192.*.*.*]

特攻隊長まるるうさん、たかみちえさん
夜分にどうもありがとうございます。

今、特攻隊長まるるうさんに教えていただいたやり方でやっています。正規表現で一致させるというのは出来ましたが、
For Each Match In Matches    〜    Next
で2個目以上をグルグル繰り返していたら、最後の一致しか赤くならないという事で、またやり直しています。

RTFというのも過去ログ見てまいります。

編集 削除
mady  2004-01-20 16:06:59  No: 111412  IP: [192.*.*.*]

荒っぽいのですが。
とりあえずそれっぽい動きはすると思います。
おそらく一部の日本語処理でバグが生じてしまうと思いますが…

' 共通関数  :キーワードハイライティング
Public Sub keywordHiliting(ByRef richTextBoxObj As RichTextBox, keyWord As String)

    Dim index As Integer

    Dim rtfRead As String
    Dim rtfWrite As String
    Dim ctbl As Long
    
    index = richTextBoxObj.SelStart

    ' RTF形式のテキストを取得
    rtfRead = richTextBoxObj.TextRTF

    ' 文字修飾クリア
    rtfRead = Replace(rtfRead, "\cf1\b ", "")
    rtfRead = Replace(rtfRead, "\\b0\cf0 ", "")
    'カラーテーブルを追加
    ctbl = InStr(rtfRead, "\viewkind")
    If ctbl <> 0 Then
        rtfRead = Left$(rtfRead, ctbl - 1) & "{\colortbl ;\red255\green0\blue0;}" & vbCrLf & Mid$(rtfRead, ctbl)
    End If
    
    
    ' strExpression に指定した文字列を、
    ' strPattern の正規表現にマッチした文字列に対し
    ' strReplaceWith に置換する

    Dim objRegExp As New regExp                                     '正規表現オブジェクトを作成

    Dim strExpression As String
    Dim strReplaceWith As String
    Dim strPattern As String
    
    strPattern = "(" + rtfEnc(keyWord) + ")"
    strReplaceWith = "\cf1\b $1\b0\cf0 "
    strExpression = rtfRead
    
    objRegExp.Pattern = strPattern                         '検索パターンの設定
    objRegExp.IgnoreCase = True                            '大文字小文字区別の設定(区別する)
    objRegExp.Global = True                                '置換候補の設定(文字列内のすべてのマッチにテストする)
    
    strExpression = objRegExp.Replace(strExpression, strReplaceWith) 'Replace メソッドで文字列の置換
    FormMain.Text1.Text = strExpression
    richTextBoxObj.TextRTF = strExpression
    richTextBoxObj.SelStart = index
End Sub

編集 削除
あや  2004-01-21 20:12:04  No: 111413  IP: [192.*.*.*]

madyさんもありがとうございました。
特攻隊長まるるうさんの方法で今頑張って挑戦しています。
madyさんの方法もまた試してみます。
ご丁寧にありがとうございました。

編集 削除