Java小工具 -- 正則表達式工具

Java實現的正則表達式工具

先來個效果圖

  1. 驗證通過的結果
    在這裏插入圖片描述
  2. 驗證不通過的結果
    在這裏插入圖片描述
  3. 正則表達式錯誤的結果
    在這裏插入圖片描述

直接上代碼

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);
	}
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章