home *** CD-ROM | disk | FTP | other *** search
Java Source | 1995-08-11 | 5.9 KB | 189 lines |
- /*
- * @(#)Regexp.java 1.1 95/04/01
- *
- * Copyright (c) 1995 Sun Microsystems, Inc. All Rights reserved Permission to
- * use, copy, modify, and distribute this software and its documentation for
- * NON-COMMERCIAL purposes and without fee is hereby granted provided that
- * this copyright notice appears in all copies. Please refer to the file
- * copyright.html for further important copyright and licensing information.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
- * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
- * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
- * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
- * ITS DERIVATIVES.
- */
-
- package java.util;
-
- /**
- * A class to represent a regular expression. Only handles '*'s.
- * @author James Gosling
- */
-
- public class Regexp {
- /** if true then the matching process ignores case. */
- public boolean ignoreCase;
-
- /*
- * regular expressions are carved into three regions: a constant string
- * prefix, a constant string suffix, and a series of floating strings in
- * between. In the input regular expression, they are seperated by *s
- */
- public String exp;
- public String prefix, suffix;
- public boolean exact;
- public int prefixLen, suffixLen, totalLen;
- public String mids[];
-
- /** Create a new regular expression object. The regular expression
- is a series of constant strings seperated by *s. For example:
- <dl>
- <dt>*.gif <dd>Matches any string that ends in ".gif".
- <dt>/tmp/* <dd>Matches any string that starts with "/tmp/".
- <dt>/tmp/*.gif <dd>Matches any string that starts with "/tmp/" and ends
- with ".gif".
- <dt>/tmp/*new*.gif <dd>Matches any string that starts with "/tmp/"
- and ends with ".gif" and has "new" somewhere in between.
- </dl>
- */
- public Regexp (String s) {
- exp = s;
- int firstst = s.indexOf('*');
- int lastst = s.lastIndexOf('*');
- if (firstst < 0) {
- totalLen = s.length();
- exact = true; // no * s
- } else {
- prefixLen = firstst;
- if (firstst == 0)
- prefix = null;
- else
- prefix = s.substring(0, firstst);
- suffixLen = s.length() - lastst - 1;
- if (suffixLen == 0)
- suffix = null;
- else
- suffix = s.substring(lastst + 1);
- int nmids = 0;
- int pos = firstst;
- while (pos < lastst && pos >= 0) {
- nmids++;
- pos = s.indexOf('*', pos + 1);
- }
- totalLen = prefixLen + suffixLen;
- if (nmids > 0) {
- mids = new String[nmids];
- pos = firstst;
- for (int i = 0; i < nmids; i++) {
- pos++;
- int npos = s.indexOf('*', pos);
- if (pos < npos) {
- mids[i] = s.substring(pos, npos);
- totalLen += mids[i].length();
- }
- pos = npos;
- }
- }
- }
- }
-
- /** Returns true iff the String s matches this regular expression. */
- final boolean matches(String s) {
- return matches(s, 0, s.length());
- }
-
- /** Returns true iff the substring of s from offset for len characters
- matches this regular expression. */
- boolean matches(String s, int offset, int len) {
- if (exact)
- return len == totalLen &&
- exp.regionMatches(ignoreCase, 0, s, offset, len);
- if (len < totalLen)
- return false;
- if (prefixLen > 0 &&
- !prefix.regionMatches(ignoreCase,
- 0, s, offset, prefixLen)
- ||
- suffixLen > 0 &&
- !suffix.regionMatches(ignoreCase,
- 0, s, offset + len - suffixLen,
- suffixLen))
- return false;
- if (mids == null)
- return true;
- int nmids = mids.length;
- int spos = offset + prefixLen;
- int limit = offset+len-suffixLen;
- for (int i = 0; i<nmids; i++) {
- String ms = mids[i];
- int ml = ms.length();
- while (spos+ml<=limit &&
- !ms.regionMatches(ignoreCase,
- 0, s, spos, ml))
- spos++;
- if (spos+ml>limit)
- return false;
- spos+=ml;
- }
- return true;
- }
-
- /** Returns subst with *s replaced by those regions of s that
- matched the *s in the regular expression. This assumes that
- s matches this regular expression. For example, given the
- regular expression "/tmp/*.ras" which matches "/tmp/foo.ras"
- invoking re.substitute("/tmp/foo.ras","/dir/*.gif") returns
- "/dir/foo.gif" */
- String substitute(String s, String subst) {
- if (exact)
- return subst;
- if (mids == null) {
- /* Just one */
- int star = subst.indexOf('*');
- if (star < 0)
- return subst;
- return subst.substring(0, star)+
- s.substring(prefixLen, s.length()-suffixLen)+
- subst.substring(star+1);
- }
- if (len < totalLen)
- return false;
- if (prefixLen > 0 &&
- !prefix.regionMatches(ignoreCase,
- 0, s, offset, prefixLen)
- ||
- suffixLen > 0 &&
- !suffix.regionMatches(ignoreCase,
- 0, s, offset + len - suffixLen,
- suffixLen))
- return false;
- if (mids == null)
- return true;
- int nmids = mids.length;
- int spos = offset + prefixLen;
- int limit = offset+len-suffixLen;
- for (int i = 0; i<nmids; i++) {
- String ms = mids[i];
- int ml = ms.length();
- while (spos+ml<=limit &&
- !ms.regionMatches(ignoreCase,
- 0, s, spos, ml))
- spos++;
- if (spos+ml>limit)
- return false;
- spos+=ml;
- }
- return true;
- }
-
- static public void main(String argv[]) {
- Regexp r = new Regexp(argv[0]);
- System.out.print("re="+r+"\n");
- r.ignoreCase = true;
- for (int i = 1; i<argv.length; i++)
- System.out.print("<"+argv[i]+"> "+r.matches(argv[i])+"\n");
- }
- }
-