カテゴリ:.Net Framework
for (int i = 0; i < regexes.Count; ++i)
{
text = regexes[i].Replace(text, replaces[i]);
}
前エントリでは RichTextBox を使った検索箇所強調表示置換のアイデアを書きました。
このアイデアでは上記のような text 自身を更新する置換コードは使えません。タグ付き正規表現で置換する場合はRegex.Replaceメソッドも使っていくことになると思いますが、使用するメソッドは
Regex.Replace からRegex.Match に代わります。
Regex.Match は Match クラス( System.Text.RegularExpressions 名前空間)のインスタンスを返します。 Match
クラスを深く知るには、スーパークラスである Group や Capture についても知っておくと良いでしょう。
置換の方法を詳しく知りたかったので今まではあまり役に立ちませんでしたが、下記の記事ではMatchクラスをよく知ることが出来ます。
Title: スマートな文字列処理のための正規表現入門(後編)
URL : http://www.atmarkit.co.jp/fdotnet/basics/regex02/regex02_01.html
一通り上記の記事とMSDNライブラリのクラスライブラリを読み、やってみました。
Match match = new Regex("xml").Match(richTextBox_Preview.Text);
while (match.Success)
{
richTextBox_Preview.Select(match.Index, match.Length);
richTextBox_Preview.SelectionColor = Color.Red;
match = match.NextMatch();
}
ASCIIの範囲内で(マルチバイト文字出現前で)したのに
「あれっ? 微妙にずれている??」
謎は解けた!
より多くヒットするように "xml" ではなく "t" 1文字にしてみました。(読み込んでいるのはXHTML 1.0 Transitional文書です。)
太字行について:Match オブジェクトの Index 、 Length は最初の Match メソッドで渡した被検索文字列に対しての値ではありますが、文字数が同じなのでこれでも問題はありません。
Match match = new Regex("t").Match(richTextBox_Preview.Text);
while (match.Success)
{
richTextBox_Preview.Select(match.Index, match.Length);
richTextBox_Preview.SelectionColor = Color.Red;
richTextBox_Preview.SelectedText = match.Value;
match = match.NextMatch();
}
1行目でヒットしたものは正しいです。真ん中にもなるとでたらめにしか見えませんが、それでも上の方は惜しかったりします。
そして気づきました。行数に応じて後ろに下がっているー!
RichTextBoxのSelectメソッドでは改行が無視されるのかな。 装飾の1つ?