/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.lang; import java.io.Serializable; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; /** *
A set of characters.
* *Instances are immutable, but instances of subclasses may not be.
* *#ThreadSafe#
* @author Apache Software Foundation * @author Phil Steitz * @author Pete Gieser * @author Gary Gregory * @since 1.0 * */ public class CharSet implements Serializable { /** * Required for serialization support. Lang version 2.0. * * @see java.io.Serializable */ private static final long serialVersionUID = 5947847346149275958L; /** * A CharSet defining no characters. * @since 2.0 */ public static final CharSet EMPTY = new CharSet((String) null); /** * A CharSet defining ASCII alphabetic characters "a-zA-Z". * @since 2.0 */ public static final CharSet ASCII_ALPHA = new CharSet("a-zA-Z"); /** * A CharSet defining ASCII alphabetic characters "a-z". * @since 2.0 */ public static final CharSet ASCII_ALPHA_LOWER = new CharSet("a-z"); /** * A CharSet defining ASCII alphabetic characters "A-Z". * @since 2.0 */ public static final CharSet ASCII_ALPHA_UPPER = new CharSet("A-Z"); /** * A CharSet defining ASCII alphabetic characters "0-9". * @since 2.0 */ public static final CharSet ASCII_NUMERIC = new CharSet("0-9"); /** * A Map of the common cases used in the factory. * Subclasses can add more common patterns if desired * @since 2.0 */ protected static final Map COMMON = Collections.synchronizedMap(new HashMap()); static { COMMON.put(null, EMPTY); COMMON.put("", EMPTY); COMMON.put("a-zA-Z", ASCII_ALPHA); COMMON.put("A-Za-z", ASCII_ALPHA); COMMON.put("a-z", ASCII_ALPHA_LOWER); COMMON.put("A-Z", ASCII_ALPHA_UPPER); COMMON.put("0-9", ASCII_NUMERIC); } /** The set of CharRange objects. */ private final Set set = Collections.synchronizedSet(new HashSet()); //----------------------------------------------------------------------- /** *Factory method to create a new CharSet using a special syntax.
* *null
or empty string ("")
* - set containing no charactersThe matching order is:
*Matching works left to right. Once a match is found the * search starts again from the next character.
* *If the same range is defined twice using the same syntax, only * one range will be kept. * Thus, "a-ca-c" creates only one range of "a-c".
* *If the start and end of a range are in the wrong order, * they are reversed. Thus "a-e" is the same as "e-a". * As a result, "a-ee-a" would create only one range, * as the "a-e" and "e-a" are the same.
* *The set of characters represented is the union of the specified ranges.
* *All CharSet objects returned by this method will be immutable.
* * @param setStr the String describing the set, may be null * @return a CharSet instance * @since 2.0 */ public static CharSet getInstance(String setStr) { Object set = COMMON.get(setStr); if (set != null) { return (CharSet) set; } return new CharSet(setStr); } /** *Constructs a new CharSet using the set syntax. * Each string is merged in with the set.
* * @param setStrs Strings to merge into the initial set, may be null * @return a CharSet instance * @since 2.4 */ public static CharSet getInstance(String[] setStrs) { if (setStrs == null) { return null; } return new CharSet(setStrs); } //----------------------------------------------------------------------- /** *Constructs a new CharSet using the set syntax.
* * @param setStr the String describing the set, may be null * @since 2.0 */ protected CharSet(String setStr) { super(); add(setStr); } /** *Constructs a new CharSet using the set syntax. * Each string is merged in with the set.
* * @param set Strings to merge into the initial set * @throws NullPointerException if set isnull
*/
protected CharSet(String[] set) {
super();
int sz = set.length;
for (int i = 0; i < sz; i++) {
add(set[i]);
}
}
//-----------------------------------------------------------------------
/**
* Add a set definition string to the CharSet
.
Gets the internal set as an array of CharRange objects.
* * @return an array of immutable CharRange objects * @since 2.0 */ public CharRange[] getCharRanges() { return (CharRange[]) set.toArray(new CharRange[set.size()]); } //----------------------------------------------------------------------- /** *Does the CharSet
contain the specified
* character ch
.
true
if the set contains the characters
*/
public boolean contains(char ch) {
for (Iterator it = set.iterator(); it.hasNext();) {
CharRange range = (CharRange) it.next();
if (range.contains(ch)) {
return true;
}
}
return false;
}
// Basics
//-----------------------------------------------------------------------
/**
* Compares two CharSet objects, returning true if they represent * exactly the same set of characters defined in the same way.
* *The two sets abc
and a-c
are not
* equal according to this method.
Gets a hashCode compatible with the equals method.
* * @return a suitable hashCode * @since 2.0 */ public int hashCode() { return 89 + set.hashCode(); } /** *Gets a string representation of the set.
* * @return string representation of the set */ public String toString() { return set.toString(); } }