// // This software is now distributed according to // the Lesser Gnu Public License. Please see // http://www.gnu.org/copyleft/lesser.txt for // the details. // -- Happy Computing! // package com.stevesoft.pat; import java.util.*; /** Shareware: package pat Copyright 2001, Steven R. Brandt */ /** The RegexTokenizer is similar to the StringTokenizer class provided with java, but allows one to tokenize using regular expressions, rather than a simple list of characters. Tokens are any strings between the supplied regular expression, as well as any backreferences (things in parenthesis) contained within the regular expression. */ public class RegexTokenizer implements Enumeration { String toParse; Regex r; int count = 0; Vector v = new Vector(); Vector vi = new Vector(); int pos=0; int offset = 1; void getMore() { String s = r.right(); if(r.searchFrom(toParse,pos)) { v.addElement(r.left().substring(pos)); vi.addElement(new Integer(r.matchFrom()+ r.charsMatched())); for(int i=0;i= v.size()) getMore(); return v.elementAt(count++); } /** This is the equivalent (String)nextElement(). */ public String nextToken() { return (String)nextElement(); } /** This asks for the next token, and changes the pattern being used at the same time. */ public String nextToken(String newpat) { try { r.compile(newpat); } catch (RegSyntax r_) {} return nextToken(r); } /** This asks for the next token, and changes the pattern being used at the same time. */ public String nextToken(Regex nr) { r = nr; if(vi.size() > count) { pos = ((Integer)vi.elementAt(count)).intValue(); v.setSize(count); vi.setSize(count); } getMore(); return nextToken(); } /** Tells whether there are more tokens in the pattern. */ public boolean hasMoreElements() { if(count >= v.size()) getMore(); return count < v.size(); } /** Tells whether there are more tokens in the pattern, but in the fashion of StringTokenizer. */ public boolean hasMoreTokens() { return hasMoreElements(); } /** Determines the # of remaining tokens */ public int countTokens() { int _count=count; while(hasMoreTokens()) nextToken(); count=_count; return v.size()-count; } /** Returns all tokens in the String */ public String[] allTokens() { countTokens(); String[] ret = new String[v.size()]; v.copyInto(ret); return ret; } };