/*
* Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved.
*
* Licensed 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 net.sf.antcontrib.property;
import java.util.Enumeration;
import java.util.Vector;
/****************************************************************************
* Regular Expression utilities
*
* @author <a href='mailto:mattinger@yahoo.com'>Matthew Inger</a>
*
****************************************************************************/
public class RegexUtil
{
/***
* An abritrary node in a select expression
*/
private static interface SelectNode
{
/***
* Select the value based on the groups
* @param groups The groups found in the match
*/
public String select(Vector groups);
}
/***
* A group node in a select expression
*/
private static class GroupSelectNode
implements SelectNode
{
private int groupNumber;
public GroupSelectNode(int groupNumber)
{
this.groupNumber = groupNumber;
}
public String select(Vector groups)
{
if ( groupNumber < groups.size())
return (String)groups.elementAt(groupNumber);
else
return "\\" + groupNumber;
}
public String toString()
{
return "group: " + groupNumber;
}
}
/***
* An abritrary node in a select expression
*/
private static class StringSelectNode
implements SelectNode
{
private String text;
public StringSelectNode(String text)
{
this.text = text;
}
public String select(Vector groups)
{
return text;
}
public String toString()
{
return "string: " + text;
}
}
/***
* Parses a select string into a List of SelectNode objects.
* These objects can then be merged with a group list to produce
* an output string (using the "select" method)
* @param input The select string
* @return a List of SelectNode objects
*/
private static Vector parseSelectString(String input)
{
Vector nodes = new Vector();
StringBuffer buf = new StringBuffer();
char c[] = input.toCharArray();
for (int i=0;i<c.length;i++)
{
if (c[i] == '\\')
{
if (buf.length() > 0)
{
nodes.addElement(new StringSelectNode(buf.toString()));
buf.setLength(0);
}
while (i+1 < c.length && Character.isDigit(c[i+1]))
{
buf.append(c[i+1]);
i++;
}
int groupNum = Integer.parseInt(buf.toString());
buf.setLength(0);
nodes.addElement(new GroupSelectNode(groupNum));
}
else
{
buf.append(c[i]);
}
}
if (buf.length() > 0)
{
nodes.addElement(new StringSelectNode(buf.toString()));
buf.setLength(0);
}
return nodes;
}
/***
* Parse a select string, and merge it with a match groups
* vector to produce an output string. Each group placehold
* in the select string is replaced with the group at the
* corresponding index in the match groups vector
* @param select The select string
* @param groups The match groups
* @return The output string with the merged selection
*/
public static String select(String select, Vector groups)
{
Vector nodes = parseSelectString(select);
StringBuffer buf = new StringBuffer();
Enumeration e = nodes.elements();
SelectNode node = null;
while (e.hasMoreElements())
{
node = (SelectNode)e.nextElement();
buf.append(node.select(groups));
}
return buf.toString();
}
}