JTextPane中的着色正则表达式单词模式不能为尾随分隔符着色

时间:2014-08-04 21:02:48

标签: java regex jtextpane

感谢这份名单上的优秀人才。我只需要请求最后一点帮助。

我有一个JTextPane,我匹配某些单词模式并将其颜色更改为红色。任何以管道/空心方括号开头,以方形括号/管道为结尾的单词或短语,如| [this] |,与以下正则表达式"(\\|\\[[^\\]]*\\])"匹配。

这可以达到99%,但它不会为尾随颜色着色红色。如果我尝试将其包含在正则表达式中,通过在末尾添加\\|,它就无法匹配任何内容。

这是我的代码。

在调用类的按钮中,我现在发送一个具有分隔符的愚蠢字符串:

private void jButton13ActionPerformed(java.awt.event.ActionEvent evt) {                                          

    JFrame Escapedframe = new JFrame("Skipppy Cars word changer");
    Escapedframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    JTextPane SkippytextPane = new JTextPane();
    SkippytextPane.setDocument(new ElementHighlight());
    SkippytextPane.setText("You should try the |[new model]| car, the |[Skippy 2000]|. The Skippy 2000 comes standard with all the |[features]| of the Bippy 3000, at half the price. You can buy one today at your |[athorized Skippy/Bippy]| dealer.");
    Escapedframe.add(SkippytextPane);

    Escapedframe.setSize(500,400);
    Escapedframe.setLocationRelativeTo(null);
    Escapedframe.setVisible(true);

}  

然后设置:

private int pipeCharEnd (String Xtext, int index) {
    while (--index >= 0) {
        if (String.valueOf(Xtext.charAt(index)).matches("\\|")) {
            break;
        }
    }
    return index;
}

private int pipeCharStart (String Xtext, int index) {
    while (index < Xtext.length()) {
        if (String.valueOf(Xtext.charAt(index)).matches("\\|")) {
            break;
        }
        index++;
    }
    return index;
}

最后是班级:

class ElementHighlight extends DefaultStyledDocument {
  private final  MutableAttributeSet XRED = new SimpleAttributeSet();
  final StyleContext myProtected = StyleContext.getDefaultStyleContext();
  final AttributeSet attR = myProtected.addAttribute(myProtected.getEmptySet(), StyleConstants.Foreground, Color.RED);
  final AttributeSet attB = myProtected.addAttribute(myProtected.getEmptySet(), StyleConstants.Foreground, Color.BLUE);

@Override
  public void insertString (int offset, String Pstr, AttributeSet RedBlue) throws BadLocationException
  {
   super.insertString(offset, Pstr, RedBlue);
   String text = getText(0, getLength());
   int pre = pipeCharEnd(text, offset);
   if (pre < 0) pre = 0;
   int post = pipeCharStart(text, offset + Pstr.length());
   int prewords = pre;
   int postwords = pre;

   while (postwords <= post) {
                if (postwords == post || String.valueOf(text.charAt(postwords)).matches("\\|")) {
                    if (text.substring(prewords, postwords).matches("(\\|\\[[^\\]]*\\])"))
                        setCharacterAttributes(prewords, postwords - prewords, attR, false);
                    else
                        setCharacterAttributes(prewords, postwords - prewords, attB, false);
                    prewords = postwords;
                }
                postwords++;
            }


  }


 }

除了每种情况下的尾随管道之外,每个分隔的短语都变为红色,正如预期的那样,它仍为蓝色。

正如我所说,在这份名单上的好人的帮助下,我已经走到了这一步。如果有人可以教我如何在分隔符中对尾管进行着色,我将非常感激。

1 个答案:

答案 0 :(得分:0)

由于您输入以下if条件:

text.substring(prewords, postwords).matches("(\\|\\[[^\\]]*\\])")

...这意味着索引Stringprewords(包含)之间的子postword -1匹配(\\|\\[[^\\]]*\\])正则表达式会查找:

  • a |后跟
  • a [后跟
  • ]后跟
  • 的任何字符序列
  • a ]

所以,考虑这个样本String

0123|[6789012345678]|12345

正则表达式将匹配|[6789012345678](而不是尾随|)。因此,我们将输入if条件,prewords的值为4postwords设置为20

prewords = 4, postwords = 20
    v               v
0123|[6789012345678]|12345

如果你这样做:

setCharacterAttributes(prewords, postwords - prewords, attR, false);

...然后你宣布:

  • postwords - prewords个字符
  • 从索引prewords
  • 开始
  • 红色

...来自索引20-4的{​​{1}}(16)个字符,我们的示例4代表以下子StringString(只有16个字符)。

如果您还要设置另外一个角色的颜色...只需在方法调用中添加|[6789012345678]即可!

即:

+1