欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java小工具 -- 正则表达式工具

程序员文章站 2022-07-08 15:56:10
...

Java实现的正则表达式工具

先来个效果图

  1. 验证通过的结果
    Java小工具 -- 正则表达式工具
  2. 验证不通过的结果
    Java小工具 -- 正则表达式工具
  3. 正则表达式错误的结果
    Java小工具 -- 正则表达式工具

直接上代码

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

Java小工具 -- 正则表达式工具