正規表現でマッチした文字列のハイライトがずれる問題
Highlighterと、HilightPainterを使ってエディタ上の文字列から指定された正規表現にマッチした文字をハイライトする処理を書いてみたが、どうも対象の文字列が\r\n(CRLF)を含む場合にハイライトがずれてしまう現象を確認。
正規表現のMatcherは正確なインデックスを返しているようだが、Hilighter(もしくは、EditorPane)が\r\nを1文字として誤認識しており、\r\nが現れる度に後ろにインデックスが1つずれているような挙動。
今のところ、下のサンプルのように、対象の文字列の\r\nを\nに置換してからマッチとハイライトを行うとずれないが…。すっきりしないのでもう少し調査する。
//エディタからHighlighterを取得 Highlighter hilighter = this.sourceEditorPane.getHighlighter(); hilighter.removeAllHighlights(); //HighlightPainterを生成 HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN); String regexp = this.regExpField.getText(); if (regexp.length() == 0) { return; } Pattern p = Pattern.compile(regexp, Pattern.MULTILINE); String source = this.SourceEditorPane.getText(); if (source.length() == 0) { return; } //インデックスのずれを回避する為改行コードを置換 source = soruce.replaceAll("\r\n","\n"); Matcher m = p.matcher(source); while(m.find()) { try { hilighter.addHighlight(m.start(),m.end(), painter); } catch (BadLocationException ex) { //なにもしない } }