Sign In Sign Out Mailing Lists Unsubscribe or Change Settings Help

OpenBSD Mailing List Server

                            Introduction to Patterns

Patterns are used by various commands and configuration settings:

  By the archive-sync command, to match archive names.
  By the lists and rekey commands, to match list names.
  By the set-pattern, unregister-pattern, unsubscribe-pattern, which, 
    and who commands, to match e-mail addresses.

  By the access_rules, advertise, bounce_probe_pattern, bounce_rules,
    delivery_rules, noadvertise, and post_limits settings, to match 
    e-mail addresses.
  By the admin_body and taboo_body settings, to match lines in
    the body of a posted message.
  By the admin_headers and taboo_headers settings, to match lines in
    the headers of a posted message.
  By the attachment_filters and attachment_rules settings, to match 
    message content types.
  By the quote_pattern setting, to count the lines in the body of a
    posted message that are marked as being written by someone else.
  By the signature_separator setting, to match the beginning of 
    an e-mail signature.


There are four supported types of pattern, described below:
  Substring Patterns,   like         "example"
  Glob Patterns,        like         %example% 
  Regular Expressions,  like         /example/
  Undelimited Patterns, like          example

Several examples of regular expressions are illustrated:
  Example 1  - a list of special characters
  Example 2  - escaping '.' is required
  Example 3  - escaping '@' is required
  Example 4  - matching the beginning and end of string
  Example 5  - matching anything and everything
  Example 6  - escaping '*' is required
  Example 7  - case sensitivity
  Example 8  - overly safe escaping doesn't hurt
  Example 9  - matching (or NOT matching) white space
  Example 10 - negated or inverted matches

Majordomo is written in the Perl programming language.  Perl regular 
expressions are a powerful but complicated tool for pattern matching.
To eliminate some of the complexity, three simpler forms of pattern 
matching are provided, in addition to full Perl regular expressions.

A pattern is usually enclosed in "delimiters," with optional "modifiers"
outside the delimiters.  The delimiters indicate where the pattern begins 
and ends, and the modifiers change how matches are found.  For example, 
in the pattern:

  "example.net"i

the delimiters are quotes, and the 'i' is a modifier.  The most common
modifier, the letter 'i', makes the matching case-insensitive, meaning 
that small and capital letters are considered identical.

The negation modifier, '!', may be used to invert any of the four
kinds of pattern.  For example,
  !edu
would match any string of characters that does not contain "edu".

The special pattern
  ALL
will match everything.

Substring Patterns
------------------

  Examples: "example.com"
            "user@somewhere.example.com"i

The delimiter is a double quote.  There are no special characters; the
pattern matches if the pattern occurs anywhere within the text to be
matched.  A trailing 'i' specifies that the matching is case-insensitive.
For instance,
  "bsc"          would match        unsubscribe
  "bsc"          would not match    unsuBsCribe
  "bsc"i         would match        unsuBsCribe


Glob Patterns
-------------

  Examples: %user@*example.com%i
            %u-???@*example.com%i

The delimiter is a percent sign.  These patterns are reminiscent of
file-matching patterns from the DOS and Unix command line interfaces.
Special characters include:

  ?    matches any single character
  *    matches any number (including zero) of any character. 
  []   are used to define character classes.  For instance,
       [abc] will match any one of the letters a, b, or c.  This
       style of grouping has the same effect as in regular expressions.


Regular Expressions
-------------------

What follows is a basic discussion of Perl regular expressions. 
There is one important difference between Majordomo regular expressions
and Perl regular expressions: in Perl version 5 and above, the
'@' character should be "escaped" with a backslash, \@.  Majordomo
will compensate if you forget to add the backslash, but for
the sake of correctness you should always include it when you
are trying to match a literal '@' symbol.

Example 1 - a list of special characters

A regular expression is a concise way of expressing a pattern in
a series of characters.  The full power of regular expressions can
make some difficult tasks quite easy, but we will only brush the
surface here.

The character / is used to mark the beginning and end of a regular
expression.  Letters and numbers stand for themselves.  Many of the
other characters are symbolic.  Some commonly used ones are:

  !     negates what follows, matching when the expression does NOT
  \@    the `@' found in nearly all addresses; it must be preceded
        by a backslash to avoid errors.
  .     (period) any character
  *     previous character, zero or more times; note especially...
  .*    any character, zero or more times
  +     previous character, one or more times; so for example...
  a+    letter "a", one or more times
  \     next character stands for itself; so for example...
  \.     literally a period, not meaning "any character"
  ^     beginning of the string; so for example...
  ^a    a string beginning with letter "a"
  $     end of the string; so for example...
  a$    a string ending with letter "a"



Example 2 - escaping '.' is required

     /foo\.example\.com/

Notice that the periods are preceded by a backslash so that they are
interpreted as periods, rather than wildcards.  This matches any string
containing:

     foo.example.com

such as:

     foo.example.com
     bar.foo.example.com
     user@bar.foo.example.com
     users%bar.foo.example.com@example.com


Example 3 - escaping '@' is required

     /johndoe\@.*foo\.example\.com/

The `@' has special meaning to Perl and should be prefixed with a backslash
to avoid errors.  The string ".*" means "any character, zero or more
times".  So this matches:

     johndoe@foo.example.com
     johndoe@terminus.foo.example.com
    ajohndoe@terminus.foo.example.com

But it doesn't match:

     johndoe@example.com
     brent@foo.example.com


Example 4 - matching the beginning and end of string

     /^johndoe\@.*cs\.example\.org$/

This is similar to Example 4.3, and matches the same first two strings:

     johndoe@foo.example.org
     johndoe@terminus.foo.example.org

But it doesn't match:

     ajohndoe@terminus.foo.example.org

...because the regular expression says the string has to begin with
letter "j" and end with letter "g", by using the ^ and $ symbols, and
neither of those is true for ajohndoe@terminus.foo.example.org@example.com.


Example 5 - matching anything and everything

     /.*/

This is the regular expression that matches anything
(any character, zero or more times).


Example 6 - escaping '*' is required

     /.\*johndoe/

Here the * is preceded by a \, so it refers literally to an asterisk
character and not the symbolic meaning "zero or more times".  The '.' still
has its symbolic meaning of "any one character", so it would match:

     a*johndoe
     s*johndoe

Because the . by itself implies one character, it would not match:

     *johndoe


Example 7 - case sensitivity

Normally all matches are case sensitive; you can make any match case
insensitive by appending an `i' to the end of the expression.

     /example\.com/i

This would match example.com, EXAMPLE.com, ExAmPlE.cOm, etc.  Removing the `i':

     /example\.com/

...would match example.com but not EXAMPLE.com or any other capitalization.


Example 8 - overly safe escaping doesn't hurt

To be on the safe side put a \ in front of any characters in the
regular expressions that are not numbers or letters.  In order to put
a / into the regular expression, the same rule holds: precede it
with a \.  Thus, with \ in front of the / and = characters, this:

     /\/CO\=US/

...matches /CO=US and may be a useful regular expression to those of you
who need to deal with X.400 addresses that contain / characters.


Example 9 - matching (or NOT matching) white space

Normally, all whitespace within a pattern is matched verbatim, but it is
sometimes desirable to add some additional space within a pattern to make
it more readable.  For instance, here is a pattern matching some common
quoting characters in email:

  /^(-|:|>|[a-z]+>)/i

This can be a bit difficult to follow, so we can space it out a bit:

  /^( - | : | > | [a-z]+> )/xi

The 'x' modifier specifies that whitespace is to be ignored, and makes the
pattern a bit easier to read.  If you want to match actual whitespace, use
'\s'.

Note that the 'x' modifier provides additional functionality to Perl code
relating to comments, but because Majordomo requires patterns to lie all on
a single line, this is not significant here.


Example 10 - negated or inverted matches

Negated matches (like !/^sub/) work in places where they have meaning, such
as the taboo expression matcher which has lots of complicated logic to handle
them, but not all places. Majordomo patterns just get sent through a function
that turns them into regular expressions... which may or may not make sense
in the context you want to use them.

For example
   who-regexp listname !/xxx\.com/
will produce a list of subscribers to "listname" that are NOT from the
'xxx.com' domain. Be careful to escape the period, which otherwise will
match any character, not just a period.

Undelimited Patterns
--------------------

In the previous sections, all of the patterns were considered to be
enclosed in quotes, slashes, or percent signs.  It is legitimate 
to use patterns without enclosing them in those delimiters in some
cases.  However, the kind of matching done will depend upon where 
the pattern is used.

  In the archive-sync command, an exact match.
  In the lists and rekey commands, an exact, case-insensitive match.
  In the which and who commands, a case-insensitive substring match.

  In the attachment_filters setting, an exact, case-insensitive match.
  In the attachment_rules setting, an exact, case-insensitive match.
  In the post_limits setting, a case-insensitive substring match.

  In all of the other cases mentioned in the first section, pattern
  delimiters are required.  Using a pattern without delimiters will
  cause an error.


See Also:
   help admin
   help archive
   help configset_access_rules
   help configset_advertise
   help configset_admin_body
   help configset_admin_headers
   help configset_attachment_filters
   help configset_attachment_rules
   help configset_bounce_probe_pattern
   help configset_bounce_rules
   help configset_delivery_rules
   help configset_noadvertise
   help configset_post_limits
   help configset_quote_pattern
   help configset_signature_separator
   help configset_taboo_body
   help configset_taboo_headers
   help lists
   help overview
   help rekey
   help set
   help unregister
   help unsubscribe
   help which
   help who

This is the "patterns" help document for 
Majordomo 2, version 0.1201103110.

For a list of all help documents, send the following command:
   help topics
in the body of a message to majordomo@openbsd.org.

For assistance, please contact the openbsd.org administrators.
Sign In Sign Out Mailing Lists Unsubscribe or Change Settings Help