package bs.util.tool.commongui.plugins; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import bs.util.io.PropertiesUtils; import bs.util.tool.commongui.GuiJPanel; import bs.util.tool.commongui.GuiUtils; /** * 正则表达式验证. */ public class RegexTester extends GuiJPanel { private static final long serialVersionUID = 1L; /** * 正则表达式文本域. */ private JTextArea regexTextArea = createJTextArea(GuiUtils.font14_un); /** * 验证字符文本域. */ private JTextArea sourceTextArea = createJTextArea(GuiUtils.font14_un); /** * 匹配结果文本域. */ private JTextArea matchTextArea = createJTextArea(GuiUtils.font14_un); /** * 帮助. */ private String helpText; /** * 是否忽略大小写,默认否. */ private boolean ignoreCase = false; /** * 是否显示详细匹配,默认否. */ private boolean viewDetail = false; /** * 替换匹配字符文本域. */ private JTextField replaceTextField = new JTextField(""); /** * 常用正则表达式-名称. */ private String[] expNames = null; /** * 常用正则表达式-表达式. */ private Map<String, String> expsMap = new HashMap<String, String>(); { // 正则帮助 String helpPropsFile = "conf/RegexTester/help.txt"; try { InputStream helpInputStream = new FileInputStream(GuiUtils.getActualPath(helpPropsFile)); int count = 0; while (count == 0) { count = helpInputStream.available(); } byte[] bytes = new byte[count]; helpInputStream.read(bytes); helpText = new String(bytes, "UTF-8"); } catch (IOException e) { logLoadPropertiesException(helpPropsFile, e); } // 常用正则表达式 String expressionPropsFile = "conf/RegexTester/expression.properties"; try { Map<String, String> expressionsMap = PropertiesUtils.getPropertiesMap(GuiUtils .getActualPath(expressionPropsFile)); List<String> expsSortAndNames = new ArrayList<String>(); for (String key : expressionsMap.keySet()) { expsSortAndNames.add(key); } Collections.sort(expsSortAndNames); // 排序 int expSize = expsSortAndNames.size() + 1; expNames = new String[expSize]; expNames[0] = "常用正则表达式"; // 常用正则表达式,按序号正排序 for (int i = 1; i < expSize; i++) { String key = expsSortAndNames.get(i - 1); String[] keySplit = key.split("_"); expNames[i] = keySplit.length > 1 ? key.substring(keySplit[0].length() + 1) : keySplit[0]; expsMap.put(expNames[i], expressionsMap.get(key)); } } catch (IOException e) { logLoadPropertiesException(expressionPropsFile, e); } } public RegexTester() { // 主面板:边界布局,只有Center部分 setLayout(new BorderLayout()); // Center,加密解密输入输出域,使用3行1列的Grid布局,使其平均显示 JPanel textAreaPanel = new JPanel(new GridLayout(3, 1)); add(textAreaPanel, BorderLayout.CENTER); JPanel regexPanel = new JPanel(new BorderLayout()); addJLabel(regexPanel, " 匹配正则: ", GuiUtils.font14b_cn, BorderLayout.WEST); regexPanel.add(new JScrollPane(regexTextArea), BorderLayout.CENTER); textAreaPanel.add(regexPanel); JPanel sourcePanel = new JPanel(new BorderLayout()); addJLabel(sourcePanel, " 匹配文本: ", GuiUtils.font14b_cn, BorderLayout.WEST); sourcePanel.add(new JScrollPane(sourceTextArea), BorderLayout.CENTER); textAreaPanel.add(sourcePanel); JPanel matchPanel = new JPanel(new BorderLayout()); addJLabel(matchPanel, " 匹配结果: ", GuiUtils.font14b_cn, BorderLayout.WEST); matchPanel.add(new JScrollPane(matchTextArea), BorderLayout.CENTER); textAreaPanel.add(matchPanel); // East,操作区域,使用BorderLayout布局 JPanel actionPanel = new JPanel(new BorderLayout()); add(actionPanel, BorderLayout.EAST); // 放置多选框等 JPanel actionGridPanel = new JPanel(new GridLayout(10, 1)); actionPanel.add(actionGridPanel, BorderLayout.NORTH); // 放置帮助按钮 JPanel helpButtonPanel = new JPanel(new GridLayout(1, 2)); helpButtonPanel.add(new Panel());// 仅作填充 addJButton(helpButtonPanel, "帮助", "", GuiUtils.font13_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { showTextAreaMessage(helpText, "帮助", JOptionPane.INFORMATION_MESSAGE, null, null); } }); actionGridPanel.add(helpButtonPanel); if (expNames != null && expNames.length != 0) { // 仅作填充 actionGridPanel.add(new JLabel("")); // 常用正则表达式下拉框 JPanel expressionsBoxPanel = new JPanel(new BorderLayout()); addJLabel(expressionsBoxPanel, " ", GuiUtils.font14_cn, BorderLayout.WEST); addJComboBox(expressionsBoxPanel, expNames, GuiUtils.font13_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { String exp = expsMap.get(((JComboBox) event.getSource()).getSelectedItem().toString()); if (exp != null) { regexTextArea.setText(exp); } } }, BorderLayout.CENTER); actionGridPanel.add(expressionsBoxPanel); } // 仅作填充 actionGridPanel.add(new JLabel("")); // 是否忽略大小写 JPanel ignoreCasePanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); addJCheckBox(ignoreCasePanel, "忽略大小写", false, GuiUtils.font14_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { JCheckBox checkBox = (JCheckBox) event.getSource(); ignoreCase = checkBox.isSelected(); } }); actionGridPanel.add(ignoreCasePanel); // 是否显示详细匹配 JPanel viewDetailPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); addJCheckBox(viewDetailPanel, "显示详细匹配", false, GuiUtils.font14_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { JCheckBox checkBox = (JCheckBox) event.getSource(); viewDetail = checkBox.isSelected(); } }); actionGridPanel.add(viewDetailPanel); // 仅作填充 actionGridPanel.add(new JLabel("")); // 替换匹配 JPanel replaceLabelPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); addJLabel(replaceLabelPanel, " 替换匹配: ", GuiUtils.font14_cn); actionGridPanel.add(replaceLabelPanel); JPanel replaceTextPanel = new JPanel(new BorderLayout()); addJLabel(replaceTextPanel, " ", GuiUtils.font14_cn, BorderLayout.WEST); addJTextField(replaceTextPanel, replaceTextField, GuiUtils.font14_un, BorderLayout.CENTER); actionGridPanel.add(replaceTextPanel); // 仅作填充 actionPanel.add(new Panel(), BorderLayout.CENTER); // 放置匹配按钮 JPanel buttonPanel = new JPanel(new GridLayout(2, 1)); actionPanel.add(buttonPanel, BorderLayout.SOUTH); // 加密按钮 addJButton(buttonPanel, "匹配", "", GuiUtils.font14b_cn, new MouseListener() { public void mouseReleased(MouseEvent event) { String regexText = regexTextArea.getText().trim(); String sourceText = sourceTextArea.getText().trim(); String replaceText = replaceTextField.getText(); Pattern p = null; if (ignoreCase) { p = Pattern.compile(regexText, Pattern.CASE_INSENSITIVE); // 不区分大小写 } else { p = Pattern.compile(regexText); } // 用Pattern类的matcher()方法生成一个Matcher对象 Matcher m = p.matcher(sourceText); StringBuffer sb = new StringBuffer(); StringBuffer rsb = new StringBuffer(); // 替换匹配 // 使用find()方法查找第一个匹配的对象 boolean result = m.find(); // 使用循环找出模式匹配的内容替换之,再将内容加到sb里 int cnt = 0; // 匹配总数 int start = 0; int end = 0; while (result) { m.appendReplacement(rsb, replaceText); // 替换匹配 cnt++; sb.append("\n"); start = m.start(); end = m.end(); String matchText = sourceText.substring(start, end); if (viewDetail) { sb.append("Match[").append(cnt).append("]: "); } sb.append(matchText); if (viewDetail) { sb.append(" [start: ").append(start).append(", end: ").append(end).append("]"); } result = m.find(); } sb.append("\n\n匹配总数: " + cnt); if (replaceText.length() != 0) { m.appendTail(rsb); sb.append("\n\n替换匹配: ").append(rsb); } matchTextArea.setText(sb.length() > 0 ? sb.substring(1) : ""); } public void mousePressed(MouseEvent e) { matchTextArea.setText(""); } public void mouseExited(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } }); } }