CSci 3501 Algorithms and Computability - Regular Expression Tester.
/*
* Computer Science 3501 - Fall 2007
* Framework for testing Java regular expressions
* Version 1.0
*
* This class contains 3 regular expressions functions to match, split, and replace substrings
* using the Java regular expression classes quickly and easily. Instead of directly dealing
* with pattern creation, managing matcher objects, and running loops on strings, you need
* only invoke the relevant function. The output for each function is meaningful.
*
* The matcher function will print the number of matches, and the matched substrings.
*
* The split function will print the number of fragments, and the fragment substrings.
*
* The replace function will print the altered output.
*
* Simply program in your regular expressions, optional parameters, and your input string(s)
* as calls to these functions.
*
* Read the function javadocs below for specific usage information.
* -Daniel Selifonov
*/
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegExTester
{
public static void main(String[] args)
{
// sample use of the functions
doRegExMatch("cAkE", Pattern.CASE_INSENSITIVE, "This cake is so delicious and moist.");
doRegExSplit("us ", "Thank you, for helping us help you help us all.");
doRegExReplace("\\d+", 0, "8000", "24 ounces of dark chocolate, 2 cups of sugar, 12 grams of ethyl benzene...");
}
/**
* Match the regular expression pattern against the input, with optional pattern flags.
*
* The pattern is expected to be a valid Java regular expression as described in
* the "Summary of regular-expression constructs" within the documentation:
* http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html
*
* Pattern flags are also described in the documentation. For this lab, you will
* likely need to provide either "0" or "Pattern.CASE_INSENSITIVE" in this
* parameter.
*
* The input can be any Java string. It will be matched against the pattern with
* any patternFlag modifiers.
*
* This function will print the pattern, input, and match count. This will be followed
* by a list of all matched sub-strings.
*
* @param pattern A regular-expression pattern.
* @param patternFlags Processing modification flags for the pattern.
* @param input A string to test.
*/
private static void doRegExMatch(String pattern, int patternFlags, String input)
{
List matches = new ArrayList();
Pattern pat = Pattern.compile(pattern, patternFlags);
Matcher mat = pat.matcher(input);
int count;
for (count = 0; mat.find(); count++)
{
matches.add(input.substring(mat.start(), mat.end()));
}
System.out.println("Matched (" + (patternFlags == Pattern.CASE_INSENSITIVE ? "case insensitive" : "case sensitive") + "): \""
+ pattern + "\" in \"" + input + "\" " + count + " times.");
for (int i = 0; i < count; i++)
{
System.out.println("\t Match #" + (i + 1) + ": " + matches.get(i));
}
System.out.println();
}
/**
* Fragment the input string by the given regular expression pattern.
*
* Java allows you to split strings by regular expressions.
* This function will take a regular expression and an input string,
* then will produce a list of all fragments produced when the
* input string is split by the regular expression defined delimiter.
*
* @param pattern A regular-expression pattern.
* @param input A string to fragment.
*/
private static void doRegExSplit(String pattern, String input)
{
Pattern pat = Pattern.compile(pattern);
String[] parts = pat.split(input);
System.out.print("Found " + parts.length + " fragments after splitting \"" + input + "\" by \"" + pattern + "\": [");
for (int i = 0; i < parts.length; i++)
{
System.out.print("\"" + parts[i] + "\"");
if (i < (parts.length - 1))
System.out.print(", ");
}
System.out.println("].");
System.out.println();
}
/**
* Replace all occurences of the pattern, with the string literal defined in replace,
* over the input string, with patternFlag processing flags.
*
* Java allows replacement of regular expression defined regions in a string
* by any string literal. This function will do that, and print the results.
*
* @param pattern The pattern defining the replacement regions.
* @param patternFlags Any modification flags on the pattern matching.
* @param replace A string literal used to replace the pattern regions. (This is not a regular expression string.)
* @param input The string upon which to perform the matching and replacement.
*/
private static void doRegExReplace(String pattern, int patternFlags, String replace, String input)
{
Pattern pat = Pattern.compile(pattern, patternFlags);
Matcher mat = pat.matcher(input);
String replaced = mat.replaceAll(replace);
System.out.println("Replaced all (" + (patternFlags == Pattern.CASE_INSENSITIVE ? "case insensitive" : "case sensitive") + ") occurrences of \""
+ pattern + "\" in sentence \"" + input + "\" with \"" + replace + "\" to make: \"" + replaced + "\".");
System.out.println();
}
}
CSci 3501
course web site.