先來個效果圖
- 驗證通過的結果
- 驗證不通過的結果
- 正則表達式錯誤的結果
直接上代碼
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));
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));
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));
add(resultLabel);
}
}