はじめまして。
RichTextBoxでの処理ができなくて困っております。
正規表現で指定したものだけを赤くするというような事をしたいのですが、やり方が分かりません。
例えば「abcdueosobidgrkebadfe」の中で「b.?d」で検索すると
bcd bid bad だけが赤になるという処理をしたいのです。
良いやり方があれば教えてください。
1、正規表現の検索の仕方
2、RichTextBox の色を置換
(3、RichTextBox で実装(クラス化?))
…全部分からないですか?。
あと、VB.NET なら Regex クラスを使ってすぐできそうですが
VB.6.0 だと…ボクはやったことなかったりします…
環境も明記してください。
不十分な記述ですみません。
使っているのはVB6.0です。
正規表現で文字を置換することはできるのですが、
検索はExecuteを使うのでしょうか。多分分かると思います。
RichTextBoxに色をつけた文字を置くのは分かるのですが、
2,3の置換と実装というのは分かりません。
宜しくお願いします。
色を変えるだけなら簡単だからねぇ。
[VB6.0]
Private Sub Command1_Click()
With Me.RichTextBox1
.Text = "012345678901234567890"
.SelStart = 3
.SelLength = 4
.SelColor = vbRed
End With
End Sub
あとは色を変える文字の位置と長さが分かればいいわけです。
正規表現の検索ができるなら、あとは文字列操作関数使えば…
検索で引っかかった文字の InStr とか?
…同じ文字の2回目の出現も気にしてね?
わたしは書式付きテキスト(RTF)は、WinHelpの作成でちょこっとふれただけですけど…。
正規表現で置き換えるとき、タグ({\b }とか)を付加してみては?
リッチエディットボックスの扱いはよく覚えていませんが、確かリッチエディットの内部の書式付きテキストを、直接取得・編集することはできましたよね?
それを使って正規表現置き換えをすれば、可能なのではないかと思いますが。
うむうむー。RTF使いたかったら過去ログをRTFで検索してみてー。
編集 削除特攻隊長まるるうさん、たかみちえさん
夜分にどうもありがとうございます。
今、特攻隊長まるるうさんに教えていただいたやり方でやっています。正規表現で一致させるというのは出来ましたが、
For Each Match In Matches 〜 Next
で2個目以上をグルグル繰り返していたら、最後の一致しか赤くならないという事で、またやり直しています。
RTFというのも過去ログ見てまいります。
荒っぽいのですが。
とりあえずそれっぽい動きはすると思います。
おそらく一部の日本語処理でバグが生じてしまうと思いますが…
' 共通関数 :キーワードハイライティング
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
madyさんもありがとうございました。
特攻隊長まるるうさんの方法で今頑張って挑戦しています。
madyさんの方法もまた試してみます。
ご丁寧にありがとうございました。