Mega Code Archive

 
Categories / Java / Regular Expressions
 

Standalone Swing GUI application for demonstrating Regular expressions

/*  * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.  * All rights reserved. Software written by Ian F. Darwin and others.  * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  *   * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee  * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,  * pioneering role in inventing and promulgating (and standardizing) the Java   * language and environment is gratefully acknowledged.  *   * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for  * inventing predecessor languages C and C++ is also gratefully acknowledged.  */ import java.awt.GridLayout; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; 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.  *   * @author Ian Darwin, http://www.darwinsys.com/  * @version #Id$  */ public class REDemo extends JPanel {   protected Pattern pattern;   protected Matcher matcher;   protected JTextField patternTF, stringTF;   protected JCheckBox compiledOK;   protected JRadioButton match, find, findAll;   protected JTextField matchesTF;   /** "main program" method - construct and show */   public static void main(String[] av) {     JFrame f = new JFrame("REDemo");     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     REDemo comp = new REDemo();     f.setContentPane(comp);     f.pack();     f.setLocation(200, 200);     f.setVisible(true);   }   /** Construct the REDemo object including its GUI */   public REDemo() {     super();     JPanel top = new JPanel();     top.add(new JLabel("Pattern:", JLabel.RIGHT));     patternTF = new JTextField(20);     patternTF.getDocument().addDocumentListener(new PatternListener());     top.add(patternTF);     top.add(new JLabel("Syntax OK?"));     compiledOK = new JCheckBox();     top.add(compiledOK);     ChangeListener cl = new ChangeListener() {       public void stateChanged(ChangeEvent ce) {         tryMatch();       }     };     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));     stringTF = new JTextField(20);     stringTF.getDocument().addDocumentListener(new StringListener());     strPane.add(stringTF);     strPane.add(new JLabel("Matches:"));     matchesTF = new JTextField(3);     strPane.add(matchesTF);     setLayout(new GridLayout(0, 1, 5, 5));     add(top);     add(strPane);     add(switchPane);   }   protected void setMatches(boolean b) {     if (b)       matchesTF.setText("Yes");     else       matchesTF.setText("No");   }   protected void setMatches(int n) {     matchesTF.setText(Integer.toString(n));   }   protected void tryCompile() {     pattern = null;     try {       pattern = Pattern.compile(patternTF.getText());       matcher = pattern.matcher("");       compiledOK.setSelected(true);     } catch (PatternSyntaxException ex) {       compiledOK.setSelected(false);     }   }   protected boolean tryMatch() {     if (pattern == null)       return false;     matcher.reset(stringTF.getText());     if (match.isSelected() && matcher.matches()) {       setMatches(true);       return true;     }     if (find.isSelected() && matcher.find()) {       setMatches(true);       return true;     }     if (findAll.isSelected()) {       int i = 0;       while (matcher.find()) {         ++i;       }       if (i > 0) {         setMatches(i);         return true;       }     }     setMatches(false);     return false;   }   /** Any change to the pattern tries to compile the result. */   class PatternListener implements DocumentListener {     public void changedUpdate(DocumentEvent ev) {       tryCompile();     }     public void insertUpdate(DocumentEvent ev) {       tryCompile();     }     public void removeUpdate(DocumentEvent ev) {       tryCompile();     }   }   /** Any change to the input string tries to match the result */   class StringListener implements DocumentListener {     public void changedUpdate(DocumentEvent ev) {       tryMatch();     }     public void insertUpdate(DocumentEvent ev) {       tryMatch();     }     public void removeUpdate(DocumentEvent ev) {       tryMatch();     }   } }