Java小工具 -- 正则表达式工具
程序员文章站
2022-07-08 15:56:10
...
先来个效果图
- 验证通过的结果
- 验证不通过的结果
- 正则表达式错误的结果
直接上代码
package com.feonix;
import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
public class RegexTool {
public static void main(String[] args) {
RegexToolFrame frame = new RegexToolFrame();
RegexToolPanel panel = new RegexToolPanel();
frame.add(panel);
frame.setVisible(true);
}
}
class RegexToolFrame extends JFrame {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 516;
private static final int HEIGHT = 506;
public RegexToolFrame() {
setTitle("RegexTool");
setSize(WIDTH, HEIGHT);
setResizable(false);
setLocationRelativeTo(null);
setIconImage(new ImageIcon(RegexToolFrame.class.getResource("RegexToolIcon.png")).getImage());
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
@SuppressWarnings("synthetic-access")
class RegexToolPanel extends JPanel {
private static final long serialVersionUID = 1L;
private static final String[] regexs = { "( )", "[ ]", "{ }", "*", "+", "?", ".", "-", "0-9", "a-z", "A-Z", "^",
"$", "\\w", "\\W", "\\d", "\\D", "\\r", "\\b", "\\B", "\\s", "\\S", "\\n", "\\u4e00-\\u9fa5", "|", "\\",
"\\v", "\\t", "\\f", "{1,15}" };
private static final JButton[] btnGroup = new JButton[regexs.length];
public RegexToolPanel() {
setLayout(null);
// 正则表达式框
JTextArea regexBox = new JTextArea();
// 字符串内容框
JTextArea textBox = new JTextArea();
// 验证结果标签
JLabel resultLabel = new JLabel(" 欢迎使用RegexTool");
int x = 10;
int y = 10;
for (int i = 0; i < regexs.length; i++) {
JButton jb = new JButton(regexs[i]);
if (i == regexs.length - 1) {
jb.setBounds(10 + 3 * 95 + 25 + 15 + 30 + 40, 10, 75, 20);
} else {
jb.setBounds(x, y, 90, 20);
}
jb.setFont(new Font("微软雅黑", 0, 11));
// 设置不绘制焦点框
jb.setFocusPainted(false);
jb.setBackground(new Color(225, 225, 225));
// 设置按钮文本内容和边框的间距
jb.setMargin(new Insets(0, 0, 0, 0));
x += 95;
if (i == 2 || (i + 3) % 5 == 0) {
x = 10;
y += 25;
}
// 监听按钮的点击事件
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取被点击按钮的文本内容
String regText = jb.getText().replaceAll("\\s", "");
// 获取光标位置
int pos = regexBox.getCaretPosition();
// 在光标位置插入获取到的文本内容
regexBox.insert(regText, pos);
}
});
add(jb);
btnGroup[i] = jb;
}
// 长度提示文字标签
JLabel lenLabel = new JLabel("长度");
lenLabel.setBounds(10 + 3 * 95, 10, 25, 20);
lenLabel.setFont(new Font("微软雅黑", 0, 11));
add(lenLabel);
// 最小长度输入框
JTextField minLen = new JTextField("1");
// 最大长度输入框
JTextField maxLen = new JTextField("15");
minLen.setBounds(10 + 3 * 95 + 25, 10, 30, 20);
// 监听最小长度输入框的内容变化事件
minLen.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
try {
String minLength = e.getDocument().getText(0, e.getDocument().getLength());
String maxLength = maxLen.getText();
btnGroup[regexs.length - 1].setText("{" + minLength + ", " + maxLength + "}");
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
});
add(minLen);
JLabel boLabel = new JLabel(" ~ ");
boLabel.setBounds(10 + 3 * 95 + 25 + 30, 10, 25, 20);
boLabel.setFont(new Font("微软雅黑", 0, 11));
add(boLabel);
maxLen.setBounds(10 + 3 * 95 + 25 + 15 + 30, 10, 30, 20);
// 监听最大长度输入框的内容变化事件
maxLen.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
try {
String maxLength = e.getDocument().getText(0, e.getDocument().getLength());
String minLength = minLen.getText();
btnGroup[regexs.length - 1].setText("{" + minLength + "," + maxLength + "}");
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
});
add(maxLen);
// 测试按钮
JButton testBtn = new JButton("测试");
testBtn.setBounds(x + 95, y, 90, 20);
testBtn.setFont(new Font("微软雅黑", 0, 11));
testBtn.setFocusPainted(false);
testBtn.setBackground(new Color(192, 192, 255));
// 监听测试按钮的点击事件
testBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取正则表达式
String regex = regexBox.getText();
// 获取待验证的内容
String text = textBox.getText();
try {
if (text.matches(regex)) {
resultLabel.setText(" 验证通过");
resultLabel.setBackground(new Color(0, 128, 0));
} else {
resultLabel.setText(" 验证不通过");
resultLabel.setBackground(new Color(255, 0, 0));
}
} catch (Exception e1) {
resultLabel.setText(" 无法解析的正则表达式");
resultLabel.setBackground(new Color(255, 0, 0));
}
resultLabel.setOpaque(true);
}
});
add(testBtn);
// 清空按钮
JButton clearBtn = new JButton("清空");
clearBtn.setBounds(x + 2 * 95, y, 90, 20);
clearBtn.setFont(new Font("微软雅黑", 0, 11));
clearBtn.setFocusPainted(false);
clearBtn.setBackground(new Color(225, 225, 225));
// 监听清空按钮的点击事件
clearBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 正则框内容清空
regexBox.setText(null);
// 内容框内容清空
textBox.setText(null);
// 结果区文字设置回最初的
resultLabel.setText(" 欢迎使用RegexTool");
// 设置透明
resultLabel.setOpaque(false);
}
});
add(clearBtn);
// 正则框前面的提示文字
JLabel regTip = new JLabel("正则");
regTip.setBounds(10, y + 30 + 35, 25, 20);
add(regTip);
// 内容框前面的提示文字
JLabel txtTip = new JLabel("内容");
txtTip.setBounds(10, y + 30 + 90 + 45, 25, 20);
add(txtTip);
// 将普通文本域设置成一个带有滚动条的
JScrollPane regexJsp = new JScrollPane(regexBox);
// 设置垂直方向在消息满了的时候,出现滚动条
regexJsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
// 设置文本框位置、大小
regexJsp.setBounds(10 + 25 + 10, y + 30, 435, 90);
// 设置自动换行
regexBox.setLineWrap(true);
// 设置正则区的文本框内边距
regexBox.setMargin(new Insets(8, 8, 8, 8));
// 设置正则区字体
regexBox.setFont(new Font("微软雅黑", Font.BOLD, 16));
// 添加到panel中
add(regexJsp);
// 将普通文本域设置成一个带有滚动条的
JScrollPane textJsp = new JScrollPane(textBox);
// 设置垂直方向在消息满了的时候,出现滚动条
textJsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
// 设置文本框位置、大小
textJsp.setBounds(10 + 25 + 10, y + 30 + 90 + 10, 435, 90);
// 设置自动换行
textBox.setLineWrap(true);
// 设置内容显的文本框内边距
textBox.setMargin(new Insets(8, 8, 8, 8));
// 设置内容区字体
textBox.setFont(new Font("微软雅黑", Font.BOLD, 16));
// 添加到panel中
add(textJsp);
// 设置验证结果区的位置和大小
resultLabel.setBounds(10 + 25 + 10, y + 30 + 90 + 10 + 90 + 10, 435, 50);
// 设置不透明
resultLabel.setOpaque(true);
// 设置字体
resultLabel.setFont(new Font("微软雅黑", Font.BOLD, 16));
// 添加到panel
add(resultLabel);
}
}