gpt4 book ai didi

java - 如何使用交替来匹配正则表达式中的最长匹配项?

转载 作者:行者123 更新时间:2023-12-01 10:29:43 24 4
gpt4 key购买 nike

我使用 Java 进行开发,并且我正在尝试找到一种智能解决方案,即使在使用 html 的多行文本时也能正确设置 JLabel 的前景色。

我知道 Swing 在将前景设置为 html 文本时遇到问题。我想使用正则表达式来发现标签的文本是否为 html 格式,如果是,则向其添加字体标签。问题是为了使其正常工作,我必须在方法末尾调用 setText() 。为了避免 StackOverflowException,必须采取一些措施。所以这是我想的正则表达式: <html>(<font [^>]*>)?((.*)(<\\/font><\\/html>)|(.*)<\\/html>)

因此,在我的重写 JLabel 的类中,我重写了 JLabel.getText() 方法:

@Override
public String getText()
{
String superText = super.getText();
if (superText == null)
return superText;
Matcher m = pattern.matcher(superText);
if (m.matches())
{
String text = "<html><font color=\""+retrieveHexColor()+"\">"+TempUtils.nvl(m.group(5), m.group(3))+"</font></html>";
if (superText.equals(text))
return superText;
superText = text;
}
setText(superText);
return superText;
}

TempUtils.nvl 仅此而已

public static <T> T nvl(T value, T defaultValue)
{
return value == null ? defaultValue : value;
}

我不太喜欢这个解决方案。你能帮助我吗?我想如果我能匹配 (<\\/font><\\/html>) 之间最长的一个和(.*)<\\/html>)我很容易解决我的问题。

编辑:有人要求我编写一些代码来测试我所说的内容:

public static void main(String[] args)
{
final JPanel panel = new JPanel(new BorderLayout());

JLabel overriddenLabel = new JLabel("<html>aBc<br>deEEEF</html>", JLabel.CENTER) {

Color foreground = Color.cyan;
{
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e)
{
foreground = Color.black;
repaint();
}
@Override
public void mouseExited(MouseEvent e)
{
foreground = Color.cyan;
repaint();
}
});
}
@Override
public Color getForeground()
{
return foreground;
}

};
JFrame frame = new JFrame("AD");
panel.add(overriddenLabel);
frame.setContentPane(panel);
frame.setVisible(true);
frame.setSize(new Dimension(300,300));
}

如您所见,设置非 html 文本可以使其正常工作。

EDIT2:吃完午饭回来。我的解决方案与此类似。它有效,但我不喜欢它。

public static void main(String[] args)
{
final JPanel panel = new JPanel(new BorderLayout());

JLabel overriddenLabel = new JLabel("<html>aBc<br>deEEEF</html>", JLabel.CENTER) {

Color foreground = Color.cyan;
{
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e)
{
foreground = Color.black;
repaint();
}
@Override
public void mouseExited(MouseEvent e)
{
foreground = Color.cyan;
repaint();
}
});
}
@Override
public Color getForeground()
{
return foreground;
}


public String colorToHex(Color color)
{
if (color == null)
return null;
String hexColor = Integer.toHexString(color.getRGB() & 0xffffff);
if (hexColor.length() < 6)
hexColor = "000000".substring(0, 6 - hexColor.length()) + hexColor;
return "#"+hexColor;
}

@Override
public String getText()
{
Pattern pattern = Pattern.compile("<html>(<font [^>]*>)?((.*)(<\\/font><\\/html>)|(.*)<\\/html>)");
String superText = super.getText();
if (superText == null)
return superText;
Matcher m = pattern.matcher(superText);
if (m.matches())
{
String text = "<html><font color=\""+colorToHex(foreground)+"\">"+(m.group(5) == null ? m.group(3) : m.group(5))+"</font></html>";
if (superText.equals(text))
return superText;
superText = text;
}
setText(superText);
return superText;
}

};
JFrame frame = new JFrame("AD");
panel.add(overriddenLabel);
frame.setContentPane(panel);
frame.setVisible(true);
frame.setSize(new Dimension(300,300));
}

最佳答案

可行的解决方案,无需使用正则表达式。

public static void main(String[] args) {
final JPanel panel = new JPanel(new BorderLayout());

JLabel overriddenLabel = new JLabel("<html>aBc<br>deEEEF</html>", JLabel.CENTER) {

Color foreground = Color.cyan;

{
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
setForeground(Color.black);
repaint();
}

@Override
public void mouseExited(MouseEvent e) {
setForeground(Color.cyan);
repaint();
}
});
}
};
overriddenLabel.setForeground(Color.cyan);
JFrame frame = new JFrame("AD");
panel.add(overriddenLabel);
frame.setContentPane(panel);
frame.setVisible(true);
frame.setSize(new Dimension(300, 300));
}

我不知道你为什么要重写getForeground,你没有用它做任何特别的事情

关于java - 如何使用交替来匹配正则表达式中的最长匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com