import java.awt.GridLayout; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** * Standalone Swing GUI application for demonstrating REs. <br/>TODO: Show the * entire match, and $1 and up as captures that matched. */ public class GuiDemo extends JPanel { protected Pattern pattern; protected Matcher m; protected JTextField pattTF, strTF; protected JCheckBox compiledOK; protected JRadioButton match, find, findAll; protected JTextField mTF; /** * "main program" method - construct and show */ public static void main(String[] av) { JFrame f = new JFrame("GuiDemo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GuiDemo comp = new GuiDemo(); f.setContentPane(comp); f.pack(); f.setLocation(200, 200); f.setVisible(true); } /** * Construct the REDemo object including its GUI */ public GuiDemo() { super(); JPanel top = new JPanel(); top.add(new JLabel("Pattern:", JLabel.RIGHT)); pattTF = new JTextField(20); pattTF.getDocument().addDocumentListener(new PattListener()); top.add(pattTF); top.add(new JLabel("Syntax OK?")); compiledOK = new JCheckBox(); top.add(compiledOK); ChangeListener cl = new ChangeListener() { @Override public void stateChanged(ChangeEvent ce) { tryToMatch(); } }; JPanel switchPane = new JPanel(); ButtonGroup bg = new ButtonGroup(); match = new JRadioButton("Match"); match.setSelected(true); match.addChangeListener(cl); bg.add(match); switchPane.add(match); find = new JRadioButton("Find"); find.addChangeListener(cl); bg.add(find); switchPane.add(find); findAll = new JRadioButton("Find All"); findAll.addChangeListener(cl); bg.add(findAll); switchPane.add(findAll); JPanel strPane = new JPanel(); strPane.add(new JLabel("String:", JLabel.RIGHT)); strTF = new JTextField(20); strTF.getDocument().addDocumentListener(new StrListener()); strPane.add(strTF); strPane.add(new JLabel("Matches:")); mTF = new JTextField(3); strPane.add(mTF); setLayout(new GridLayout(0, 1, 5, 5)); add(top); add(strPane); add(switchPane); } protected void setMatch(boolean b) { if (b) { mTF.setText("Yes"); } else { mTF.setText("No"); } } protected void setMatch(int n) { mTF.setText(Integer.toString(n)); } protected void tryToCompile() { pattern = null; try { pattern = Pattern.compile(pattTF.getText()); m = pattern.matcher(""); compiledOK.setSelected(true); } catch (PatternSyntaxException ex) { compiledOK.setSelected(false); } } protected boolean tryToMatch() { if (pattern == null) { return false; } m.reset(strTF.getText()); if (match.isSelected() && m.matches()) { setMatch(true); return true; } if (find.isSelected() && m.find()) { setMatch(true); return true; } if (findAll.isSelected()) { int i = 0; while (m.find()) { ++i; } if (i > 0) { setMatch(i); return true; } } setMatch(false); return false; } /** * Any change to the pattern tries to compile the result. */ class PattListener implements DocumentListener { @Override public void changedUpdate(DocumentEvent ev) { tryToCompile(); } @Override public void insertUpdate(DocumentEvent ev) { tryToCompile(); } @Override public void removeUpdate(DocumentEvent ev) { tryToCompile(); } } /** * Any change to the input string tries to match the result */ class StrListener implements DocumentListener { @Override public void changedUpdate(DocumentEvent ev) { tryToMatch(); } @Override public void insertUpdate(DocumentEvent ev) { tryToMatch(); } @Override public void removeUpdate(DocumentEvent ev) { tryToMatch(); } } }