A character class is used to pattern match one of a set of characters. A character in the input data will match a character class if it matches any one of the characters in the character class.
For example, the OmniMark built-in character class digit includes the characters 0,
1, 2, 3, 4, 5, 6, 7, 8,
and 9. Given the input data 123ABC, the following pattern will match 1:
find digit
And the following pattern will match 123:
find digit+
OmniMark provides the following predefined character classes:
letter—matches a single letter character, uppercase or lowercase
uc—matches a single uppercased letter
lc—matches a single lowercased letter
digit—matches a single digit (0-9)
space—matches a single space character
blank—matches a single space or tab character
white-space—matches a single space, tab, or newline character
any-text—matches any single character except for a newline
any—matches any single character
Since the predefined character classes may not always meet your needs, OmniMark lets you define your own
character classes. A programmer-defined character class is contained between square brackets. For example, the
following pattern matches an arithmetic operator:
find ["+-*/"]
This character class consists of any of the characters in the string +-*/. If your character class
will contain many characters, you can include every character except those you specify by preceding the string of
characters with the operator \. For example, the following pattern matches any character
except the XML
markup characters <, &, and >:
find [\ "<&>"]
You can also specify a character set by adding or subtracting characters from a built-in character set. To add
characters, you join character classes and strings with the or operator |. For example, the following
pattern matches any hexadecimal digit:
find [digit | "AaBcCcDdEeFf"]
To subtract characters, you use the operator \. For example, the following pattern matches any octal
digit:
find [digit \ "89"]
You can also use the operator | to join two or more built-in character classes, as in this pattern that
matches any alpha-numeric character:
find [letter | digit]
Note that while you can use the operator | as many times as you like, you can only use the operator
once in a character class. Thus this pattern is not valid:
find [letter \ "xyz" | digit \ "7"]
You must rewrite it as follows:
find [letter | digit \ "xyz7"]
You can also specify ranges of characters using to. For example, the following code fragment matches
any character between the lowercase letters a and m:
find ["a" to "m"]
You can combine ranges or exclude them from other things in a character set, including other ranges. For example,
the following pattern matches any character between the lowercase letters a and z as well as
the period, the comma, or the interrogation mark; it does not match the lowercase letters between
i and n or the lowercase letter t:
find ["a" to "z" | ".,?" \ "i" to "n" | "t"]
Take care when using character set ranges because the letters of the alphabet are not always contiguous in a character set. In the EBCDIC character encoding, for example, there are non-alphabetic characters between A and Z.
Don't confuse a character class with a pattern. If you want to match any number of characters up to the first
colon you can write either:
find [\ ":"]*or
find any ** lookahead ":"
But if you need to match any number of characters up to a multi-character delimiter such as
</price>, you must write:
find any ** lookahead "</price>"and not
find [\ "</price>"]*
The latter will match any number of characters up to the first <, /, p, r, i, c, e, or > character, not any number of characters up to the string </price>.
In previous versions of OmniMark, the keyword any was required before the \ operator in
creating an any except character class. Thus the character class [\ "aeiou"] would be written
[any \ "aeiou"]. The form [any \ "aeiou"] is still permitted and is identical in
meaning to [\ "aeiou"].
The word except is a deprecated synonym for the except operator \.