感谢这份名单上的优秀人才。我只需要请求最后一点帮助。
我有一个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++;
}
}
}
除了每种情况下的尾随管道之外,每个分隔的短语都变为红色,正如预期的那样,它仍为蓝色。
正如我所说,在这份名单上的好人的帮助下,我已经走到了这一步。如果有人可以教我如何在分隔符中对尾管进行着色,我将非常感激。
答案 0 :(得分:0)
由于您输入以下if
条件:
text.substring(prewords, postwords).matches("(\\|\\[[^\\]]*\\])")
...这意味着索引String
和prewords
(包含)之间的子postword -1
匹配(\\|\\[[^\\]]*\\])
。 正则表达式会查找:
|
后跟[
后跟]
后跟]
。所以,考虑这个样本String
:
0123|[6789012345678]|12345
正则表达式将匹配|[6789012345678]
(而不是尾随|
)。因此,我们将输入if
条件,prewords
的值为4
且postwords
设置为20
。
prewords = 4, postwords = 20
v v
0123|[6789012345678]|12345
如果你这样做:
setCharacterAttributes(prewords, postwords - prewords, attR, false);
...然后你宣布:
postwords - prewords
个字符prewords
...来自索引20-4
的{{1}}(16)个字符,我们的示例4
代表以下子String
:String
(只有16个字符)。
如果您还要设置另外一个角色的颜色...只需在方法调用中添加|[6789012345678]
即可!
即:
+1