regex
Swing GUI application for regular expression testing
This is an example of how to create a Swing GUI application for regular expression testing. The application creates a window that reads a pattern and a String and checks if the String matches the pattern and how many times the pattern appears in the String. The steps to create such an application are described below:
- Class
GuiDemo
extends the JPanel and consists of a Pattern, a Matcherm
, two JTextFieldpattTF
andstrTF
, a JCheckBoxcompiledOK
, three JRadioButtonmatch
,find
,findAll
and a JTextFieldmTF
. It has four methods. - The method
setMatch(boolean b)
sets the JTextFieldmTF
to yes or no, according to the boolean parameter. - The method
setMatch(int n)
sets the JTextFieldmTF
to the String representation of the int parameter. - The method
tryToCompile()
creates a new pattern by compiling the JTextFieldpattTF
String representation, withgetText()
API method of JTextComponent and thencompile(String regex)
API method of Pattern. Then it creates a Matcher to match the pattern withmatcher(CharSequence input)
API method of Pattern and it sets the JCheckBoxcompiledOK
to true, usingsetSelected(boolean b)
of AbstractButton. If a PatternSyntaxException is thrown then thecompiledOK
is set to false. - The method
boolean tryToMatch()
checks if the pattern is null, and if so it returns false, else it resets the matcher with the
the JTextFieldstrTF
String, withgetText()
API method of JTextComponent. Then, if the JRadioButton match is set to true, withisSelected()
API method of AbstractButton and the matcher matches against the pattern, withmatches()
API method of Matcher, then it calls thesetMatch(boolean b)
method of the class, with parameter set to true and returns true. If the JRadioButtonfind
is set to true and the matcher finds the next input sequence that matches the pattern, withfind()
API method of Matcher it calls thesetMatch(boolean b)
method of the class, with parameter set to true and returns true. If the JRadioButtonfindAll
is set to true then it finds the next subsequence of the input sequence that matches the pattern it increases an int variable and then callssetMatch(int n)
method of class, and returns true. - The two JTextField
pattTF
andstrTF
are two classesPattListener
andStrListener
that both implement the DocumentListener, that is an interface for an observer to register to receive notifications of changes to a text document. Every timechangedUpdate(DocumentEvent ev)
,insertUpdate(DocumentEvent ev)
,removeUpdate(DocumentEvent ev)
are invoked thePattListener
callstryToCompile()
method andStrListener
callstryToMatch()
method.
Let’s take a look at the code snippet that follows:
package com.javacodegeeks.snippets.core; 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(); } } }
This was an example of Swing GUI application for regular expression testing in Java.