SSISO Community

시소당

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();
        }
    }
}
[2008년  04월  04일  09:28:48  수정되었습니다.]

978 view

4.0 stars