Java Regex - 不对JTextPane中的所有匹配单词着色

时间:2016-06-06 03:30:08

标签: java regex jtextpane

我希望着色与commment匹配的所有单词

public WarnaText(JTextPane source) throws BadLocationException
{
    source.setForeground(Color.BLACK);
    Matcher komen=Pattern.compile("//.+").matcher(source.getText());
    while(komen.find())
    {
        String getkomen=komen.group();
        StyleContext sc = StyleContext.getDefaultStyleContext();
        AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, Color.RED);
        aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Concolas");

        int start = source.getText().indexOf(getkomen);
        source.select(start,start + getkomen.length());

        source.setCharacterAttributes(aset, false);
    }
}

但是,有些单词在JTextPane上没有着色,其中包含许多注释

2 个答案:

答案 0 :(得分:1)

您的代码检索评论文本(getkomen=komen.group()),然后搜索该文本的第一个实例(...indexOf(getkomen))。如果您有多个相同的注释,则只有第一个注释会被着色。

Matcher会使用start()end()为您找到找到的文字的位置。你应该使用它们。

Matcher komen=Pattern.compile("//.+").matcher(source.getText());
while(komen.find())
{
    StyleContext sc = StyleContext.getDefaultStyleContext();
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, Color.RED);
    aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Concolas");

    source.select(komen.start(), komen.end());

    source.setCharacterAttributes(aset, false);
}

答案 1 :(得分:-1)

您可以从source.select(start, start+getkomen.length)更改为source.select(komen.start(),komen.end())

public WarnaText(JTextPane source) throws BadLocationException
{
    source.setForeground(Color.BLACK);
    Matcher komen=Pattern.compile("(/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(\\/\\/.+)").matcher(source.getText());
    while(komen.find())
    {
        StyleContext sc = StyleContext.getDefaultStyleContext();
        AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, Color.RED);

        aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Concolas");

        source.select(komen.start(),komen.end());

        source.setCharacterAttributes(aset, false);
    }
}