criptics.com">tcl8.0. Much of the description below is copied verbatim from the tcl8.0 regsub manual entry.
REGULAR EXPRESSIONS
A regular expression is zero or more branches
, separated by "|". It matches anything that matches one of the branches.
A branch is zero or more pieces
, concatenated. It matches a match for the first piece, followed by a match for the second piece, etc.
A piece is an atom
, possibly followed by "*", "+", or "?".
- An atom followed by "*" matches a sequence of 0 or more matches of the atom.
- An atom followed by "+" matches a sequence of 1 or more matches of the atom.
- An atom followed by "?" matches either 0 or 1 matches of the atom.
An atom is
- a regular expression in parentheses (matching a match for the regular expression)
- a
range
(see below) - "." (matching any single character)
- "^" (matching the null string at the beginning of the input string)
- "$" (matching the null string at the end of the input string)
- a "\" followed by a single character (matching that character)
- a single character with no other significance (matching that character).
A range
is a sequence of characters enclosed in "[]". The range normally matches any single character from the sequence. If the sequence begins with "^", the range matches any single character not from the rest of the sequence. If two characters in the sequence are separated by "-", this is shorthand for the full list of characters between them (e.g. "[0-9]" matches any decimal digit). To include a literal "]" in the sequence, make it the first character (following a possible "^"). To include a literal "-", make it the first or last character.
In general there may be more than one way to match a regular expression to an input string. For example, consider the command
String[] match = new String[2]; Regexp.match("(a*)b*", "aabaaabb", match);
Considering only the rules given so far,
match[0]
and
match[1]
could end up with the values
- "aabb" and "aa"
- "aaab" and "aaa"
- "ab" and "a"
or any of several other combinations. To resolve this potential ambiguity, Regexp chooses among alternatives using the rule "first then longest". In other words, it considers the possible matches in order working from left to right across the input string and the pattern, and it attempts to match longer pieces of the input string before shorter ones. More specifically, the following rules apply in decreasing order of priority:
- If a regular expression could match two different parts of an input string then it will match the one that begins earliest.
- If a regular expression contains "|" operators then the leftmost matching sub-expression is chosen.
- In "*", "+", and "?" constructs, longer matches are chosen in preference to shorter ones.
- In sequences of expression components the components are considered from left to right.
In the example from above, "(a*)b*" therefore matches exactly "aab"; the "(a*)" portion of the pattern is matched first and it consumes the leading "aa", then the "b*" portion of the pattern consumes the next "b". Or, consider the following example:
String match = new String[3]; Regexp.match("(ab|a)(b*)c", "abc", match);
After this command,
match[0]
will be "abc",
match[1]
will be "ab", and
match[2]
will be an empty string. Rule 4 specifies that the "(ab|a)" component gets first shot at the input string and Rule 2 specifies that the "ab" sub-expression is checked before the "a" sub-expression. Thus the "b" has already been claimed before the "(b*)" component is checked and therefore "(b*)" must match an empty string.
REGULAR EXPRESSION SUBSTITUTION
Regular expression substitution matches a string against a regular expression, transforming the string by replacing the matched region(s) with new substring(s).
What gets substituted into the result is controlled by a subspec
. The subspec is a formatting string that specifies what portions of the matched region should be substituted into the result.
- "&" or "\0" is replaced with a copy of the entire matched region.
- "\
n
", where n
is a digit from 1 to 9, is replaced with a copy of the n
th subexpression. - "\&" or "\\" are replaced with just "&" or "\" to escape their special meaning.
- any other character is passed through.
In the above, strings like "\2" represents the two characters
backslash
and "2", not the Unicode character 0002.
Here is an example of how to use Regexp
public static void main(String[] args) throws Exception { Regexp re; String[] matches; String s; / * A regular expression to match the first line of a HTTP request. * * 1. ^ - starting at the beginning of the line * 2. ([A-Z]+) - match and remember some upper case characters * 3. [ \t]+ - skip blank space * 4. ([^ \t]*) - match and remember up to the next blank space * 5. [ \t]+ - skip more blank space * 6. (HTTP/1\\.[01]) - match and remember HTTP/1.0 or HTTP/1.1 * 7. $ - end of string - no chars left. */ s = "GET http://a.b.com:1234/index.html HTTP/1.1"; re = new Regexp("^([A-Z]+)[ \t]+([^ \t]+)[ \t]+(HTTP/1\\.[01])$"); matches = new String[4]; if (re.match(s, matches)) { System.out.println("METHOD " + matches[1]); System.out.println("URL " + matches[2]); System.out.println("VERSION " + matches[3]); } / * A regular expression to extract some simple comma-separated data, * reorder some of the columns, and discard column 2. */ s = "abc,def,ghi,klm,nop,pqr"; re = new Regexp("^([^,]+),([^,]+),([^,]+),(.*)"); System.out.println(re.sub(s, "\\3,\\1,\\4")); }
@author Colin Stevens (colin.stevens@sun.com)
@version 2.3
@see Regsub