mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Doc: remove src/backend/regex/re_syntax.n.
We aren't publishing this file as documentation, and it's been
much more haphazardly maintained than the real docs in func.sgml,
so let's just drop it. I think the only reason I included it in
commit 7bcc6d98f
was that the Berkeley-era sources had had a man
page in this directory.
Discussion: https://postgr.es/m/4099447.1614186542@sss.pgh.pa.us
This commit is contained in:
@ -1,979 +0,0 @@
|
|||||||
'\"
|
|
||||||
'\" Copyright (c) 1998 Sun Microsystems, Inc.
|
|
||||||
'\" Copyright (c) 1999 Scriptics Corporation
|
|
||||||
'\"
|
|
||||||
'\" This software is copyrighted by the Regents of the University of
|
|
||||||
'\" California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
|
|
||||||
'\" Corporation and other parties. The following terms apply to all files
|
|
||||||
'\" associated with the software unless explicitly disclaimed in
|
|
||||||
'\" individual files.
|
|
||||||
'\"
|
|
||||||
'\" The authors hereby grant permission to use, copy, modify, distribute,
|
|
||||||
'\" and license this software and its documentation for any purpose, provided
|
|
||||||
'\" that existing copyright notices are retained in all copies and that this
|
|
||||||
'\" notice is included verbatim in any distributions. No written agreement,
|
|
||||||
'\" license, or royalty fee is required for any of the authorized uses.
|
|
||||||
'\" Modifications to this software may be copyrighted by their authors
|
|
||||||
'\" and need not follow the licensing terms described here, provided that
|
|
||||||
'\" the new terms are clearly indicated on the first page of each file where
|
|
||||||
'\" they apply.
|
|
||||||
'\"
|
|
||||||
'\" IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
|
|
||||||
'\" FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
|
||||||
'\" ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
|
|
||||||
'\" DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
|
|
||||||
'\" POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
'\"
|
|
||||||
'\" THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
|
|
||||||
'\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
|
||||||
'\" FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
|
|
||||||
'\" IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
|
|
||||||
'\" NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
|
|
||||||
'\" MODIFICATIONS.
|
|
||||||
'\"
|
|
||||||
'\" GOVERNMENT USE: If you are acquiring this software on behalf of the
|
|
||||||
'\" U.S. government, the Government shall have only "Restricted Rights"
|
|
||||||
'\" in the software and related documentation as defined in the Federal
|
|
||||||
'\" Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
|
|
||||||
'\" are acquiring the software on behalf of the Department of Defense, the
|
|
||||||
'\" software shall be classified as "Commercial Computer Software" and the
|
|
||||||
'\" Government shall have only "Restricted Rights" as defined in Clause
|
|
||||||
'\" 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the
|
|
||||||
'\" authors grant the U.S. Government and others acting in its behalf
|
|
||||||
'\" permission to use and distribute the software in accordance with the
|
|
||||||
'\" terms specified in this license.
|
|
||||||
'\"
|
|
||||||
'\" RCS: @(#) Id: re_syntax.n,v 1.3 1999/07/14 19:09:36 jpeek Exp
|
|
||||||
'\"
|
|
||||||
.so man.macros
|
|
||||||
.TH re_syntax n "8.1" Tcl "Tcl Built-In Commands"
|
|
||||||
.BS
|
|
||||||
.SH NAME
|
|
||||||
re_syntax \- Syntax of Tcl regular expressions.
|
|
||||||
.BE
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
A \fIregular expression\fR describes strings of characters.
|
|
||||||
It's a pattern that matches certain strings and doesn't match others.
|
|
||||||
|
|
||||||
.SH "DIFFERENT FLAVORS OF REs"
|
|
||||||
Regular expressions (``RE''s), as defined by POSIX, come in two
|
|
||||||
flavors: \fIextended\fR REs (``EREs'') and \fIbasic\fR REs (``BREs'').
|
|
||||||
EREs are roughly those of the traditional \fIegrep\fR, while BREs are
|
|
||||||
roughly those of the traditional \fIed\fR. This implementation adds
|
|
||||||
a third flavor, \fIadvanced\fR REs (``AREs''), basically EREs with
|
|
||||||
some significant extensions.
|
|
||||||
.PP
|
|
||||||
This manual page primarily describes AREs. BREs mostly exist for
|
|
||||||
backward compatibility in some old programs; they will be discussed at
|
|
||||||
the end. POSIX EREs are almost an exact subset of AREs. Features of
|
|
||||||
AREs that are not present in EREs will be indicated.
|
|
||||||
|
|
||||||
.SH "REGULAR EXPRESSION SYNTAX"
|
|
||||||
.PP
|
|
||||||
Tcl regular expressions are implemented using the package written by
|
|
||||||
Henry Spencer, based on the 1003.2 spec and some (not quite all) of
|
|
||||||
the Perl5 extensions (thanks, Henry!). Much of the description of
|
|
||||||
regular expressions below is copied verbatim from his manual entry.
|
|
||||||
.PP
|
|
||||||
An ARE is one or more \fIbranches\fR,
|
|
||||||
separated by `\fB|\fR',
|
|
||||||
matching anything that matches any of the branches.
|
|
||||||
.PP
|
|
||||||
A branch is zero or more \fIconstraints\fR or \fIquantified atoms\fR,
|
|
||||||
concatenated.
|
|
||||||
It matches a match for the first, followed by a match for the second, etc;
|
|
||||||
an empty branch matches the empty string.
|
|
||||||
.PP
|
|
||||||
A quantified atom is an \fIatom\fR possibly followed
|
|
||||||
by a single \fIquantifier\fR.
|
|
||||||
Without a quantifier, it matches a match for the atom.
|
|
||||||
The quantifiers,
|
|
||||||
and what a so-quantified atom matches, are:
|
|
||||||
.RS 2
|
|
||||||
.TP 6
|
|
||||||
\fB*\fR
|
|
||||||
a sequence of 0 or more matches of the atom
|
|
||||||
.TP
|
|
||||||
\fB+\fR
|
|
||||||
a sequence of 1 or more matches of the atom
|
|
||||||
.TP
|
|
||||||
\fB?\fR
|
|
||||||
a sequence of 0 or 1 matches of the atom
|
|
||||||
.TP
|
|
||||||
\fB{\fIm\fB}\fR
|
|
||||||
a sequence of exactly \fIm\fR matches of the atom
|
|
||||||
.TP
|
|
||||||
\fB{\fIm\fB,}\fR
|
|
||||||
a sequence of \fIm\fR or more matches of the atom
|
|
||||||
.TP
|
|
||||||
\fB{\fIm\fB,\fIn\fB}\fR
|
|
||||||
a sequence of \fIm\fR through \fIn\fR (inclusive) matches of the atom;
|
|
||||||
\fIm\fR may not exceed \fIn\fR
|
|
||||||
.TP
|
|
||||||
\fB*? +? ?? {\fIm\fB}? {\fIm\fB,}? {\fIm\fB,\fIn\fB}?\fR
|
|
||||||
\fInon-greedy\fR quantifiers,
|
|
||||||
which match the same possibilities,
|
|
||||||
but prefer the smallest number rather than the largest number
|
|
||||||
of matches (see MATCHING)
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
The forms using
|
|
||||||
\fB{\fR and \fB}\fR
|
|
||||||
are known as \fIbound\fRs.
|
|
||||||
The numbers
|
|
||||||
\fIm\fR and \fIn\fR are unsigned decimal integers
|
|
||||||
with permissible values from 0 to 255 inclusive.
|
|
||||||
.PP
|
|
||||||
An atom is one of:
|
|
||||||
.RS 2
|
|
||||||
.TP 6
|
|
||||||
\fB(\fIre\fB)\fR
|
|
||||||
(where \fIre\fR is any regular expression)
|
|
||||||
matches a match for
|
|
||||||
\fIre\fR, with the match noted for possible reporting
|
|
||||||
.TP
|
|
||||||
\fB(?:\fIre\fB)\fR
|
|
||||||
as previous,
|
|
||||||
but does no reporting
|
|
||||||
(a ``non-capturing'' set of parentheses)
|
|
||||||
.TP
|
|
||||||
\fB()\fR
|
|
||||||
matches an empty string,
|
|
||||||
noted for possible reporting
|
|
||||||
.TP
|
|
||||||
\fB(?:)\fR
|
|
||||||
matches an empty string,
|
|
||||||
without reporting
|
|
||||||
.TP
|
|
||||||
\fB[\fIchars\fB]\fR
|
|
||||||
a \fIbracket expression\fR,
|
|
||||||
matching any one of the \fIchars\fR (see BRACKET EXPRESSIONS for more detail)
|
|
||||||
.TP
|
|
||||||
\fB.\fR
|
|
||||||
matches any single character
|
|
||||||
.TP
|
|
||||||
\fB\e\fIk\fR
|
|
||||||
(where \fIk\fR is a non-alphanumeric character)
|
|
||||||
matches that character taken as an ordinary character,
|
|
||||||
e.g. \e\e matches a backslash character
|
|
||||||
.TP
|
|
||||||
\fB\e\fIc\fR
|
|
||||||
where \fIc\fR is alphanumeric
|
|
||||||
(possibly followed by other characters),
|
|
||||||
an \fIescape\fR (AREs only),
|
|
||||||
see ESCAPES below
|
|
||||||
.TP
|
|
||||||
\fB{\fR
|
|
||||||
when followed by a character other than a digit,
|
|
||||||
matches the left-brace character `\fB{\fR';
|
|
||||||
when followed by a digit, it is the beginning of a
|
|
||||||
\fIbound\fR (see above)
|
|
||||||
.TP
|
|
||||||
\fIx\fR
|
|
||||||
where \fIx\fR is
|
|
||||||
a single character with no other significance, matches that character.
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
A \fIconstraint\fR matches an empty string when specific conditions
|
|
||||||
are met.
|
|
||||||
A constraint may not be followed by a quantifier.
|
|
||||||
The simple constraints are as follows; some more constraints are
|
|
||||||
described later, under ESCAPES.
|
|
||||||
.RS 2
|
|
||||||
.TP 8
|
|
||||||
\fB^\fR
|
|
||||||
matches at the beginning of a line
|
|
||||||
.TP
|
|
||||||
\fB$\fR
|
|
||||||
matches at the end of a line
|
|
||||||
.TP
|
|
||||||
\fB(?=\fIre\fB)\fR
|
|
||||||
\fIpositive lookahead\fR (AREs only), matches at any point
|
|
||||||
where a substring matching \fIre\fR begins
|
|
||||||
.TP
|
|
||||||
\fB(?!\fIre\fB)\fR
|
|
||||||
\fInegative lookahead\fR (AREs only), matches at any point
|
|
||||||
where no substring matching \fIre\fR begins
|
|
||||||
.TP
|
|
||||||
\fB(?<=\fIre\fB)\fR
|
|
||||||
\fIpositive lookbehind\fR (AREs only), matches at any point
|
|
||||||
where a substring matching \fIre\fR ends
|
|
||||||
.TP
|
|
||||||
\fB(?<!\fIre\fB)\fR
|
|
||||||
\fInegative lookbehind\fR (AREs only), matches at any point
|
|
||||||
where no substring matching \fIre\fR ends
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Lookahead and lookbehind constraints may not contain back references
|
|
||||||
(see later), and all parentheses within them are considered non-capturing.
|
|
||||||
.PP
|
|
||||||
An RE may not end with `\fB\e\fR'.
|
|
||||||
|
|
||||||
.SH "BRACKET EXPRESSIONS"
|
|
||||||
A \fIbracket expression\fR is a list of characters enclosed in `\fB[\|]\fR'.
|
|
||||||
It normally matches any single character from the list (but see below).
|
|
||||||
If the list begins with `\fB^\fR',
|
|
||||||
it matches any single character
|
|
||||||
(but see below) \fInot\fR from the rest of the list.
|
|
||||||
.PP
|
|
||||||
If two characters in the list are separated by `\fB\-\fR',
|
|
||||||
this is shorthand
|
|
||||||
for the full \fIrange\fR of characters between those two (inclusive) in the
|
|
||||||
collating sequence,
|
|
||||||
e.g.
|
|
||||||
\fB[0\-9]\fR
|
|
||||||
in ASCII matches any decimal digit.
|
|
||||||
Two ranges may not share an
|
|
||||||
endpoint, so e.g.
|
|
||||||
\fBa\-c\-e\fR
|
|
||||||
is illegal.
|
|
||||||
Ranges are very collating-sequence-dependent,
|
|
||||||
and portable programs should avoid relying on them.
|
|
||||||
.PP
|
|
||||||
To include a literal
|
|
||||||
\fB]\fR
|
|
||||||
or
|
|
||||||
\fB\-\fR
|
|
||||||
in the list,
|
|
||||||
the simplest method is to
|
|
||||||
enclose it in
|
|
||||||
\fB[.\fR and \fB.]\fR
|
|
||||||
to make it a collating element (see below).
|
|
||||||
Alternatively,
|
|
||||||
make it the first character
|
|
||||||
(following a possible `\fB^\fR'),
|
|
||||||
or (AREs only) precede it with `\fB\e\fR'.
|
|
||||||
Alternatively, for `\fB\-\fR',
|
|
||||||
make it the last character,
|
|
||||||
or the second endpoint of a range.
|
|
||||||
To use a literal
|
|
||||||
\fB\-\fR
|
|
||||||
as the first endpoint of a range,
|
|
||||||
make it a collating element
|
|
||||||
or (AREs only) precede it with `\fB\e\fR'.
|
|
||||||
With the exception of these, some combinations using
|
|
||||||
\fB[\fR
|
|
||||||
(see next
|
|
||||||
paragraphs), and escapes,
|
|
||||||
all other special characters lose their
|
|
||||||
special significance within a bracket expression.
|
|
||||||
.PP
|
|
||||||
Within a bracket expression, a collating element (a character,
|
|
||||||
a multi-character sequence that collates as if it were a single character,
|
|
||||||
or a collating-sequence name for either)
|
|
||||||
enclosed in
|
|
||||||
\fB[.\fR and \fB.]\fR
|
|
||||||
stands for the
|
|
||||||
sequence of characters of that collating element.
|
|
||||||
The sequence is a single element of the bracket expression's list.
|
|
||||||
A bracket expression in a locale that has
|
|
||||||
multi-character collating elements
|
|
||||||
can thus match more than one character.
|
|
||||||
.VS 8.2
|
|
||||||
So (insidiously), a bracket expression that starts with \fB^\fR
|
|
||||||
can match multi-character collating elements even if none of them
|
|
||||||
appear in the bracket expression!
|
|
||||||
(\fINote:\fR Tcl currently has no multi-character collating elements.
|
|
||||||
This information is only for illustration.)
|
|
||||||
.PP
|
|
||||||
For example, assume the collating sequence includes a \fBch\fR
|
|
||||||
multi-character collating element.
|
|
||||||
Then the RE \fB[[.ch.]]*c\fR (zero or more \fBch\fP's followed by \fBc\fP)
|
|
||||||
matches the first five characters of `\fBchchcc\fR'.
|
|
||||||
Also, the RE \fB[^c]b\fR matches all of `\fBchb\fR'
|
|
||||||
(because \fB[^c]\fR matches the multi-character \fBch\fR).
|
|
||||||
.VE 8.2
|
|
||||||
.PP
|
|
||||||
Within a bracket expression, a collating element enclosed in
|
|
||||||
\fB[=\fR
|
|
||||||
and
|
|
||||||
\fB=]\fR
|
|
||||||
is an equivalence class, standing for the sequences of characters
|
|
||||||
of all collating elements equivalent to that one, including itself.
|
|
||||||
(If there are no other equivalent collating elements,
|
|
||||||
the treatment is as if the enclosing delimiters were `\fB[.\fR'\&
|
|
||||||
and `\fB.]\fR'.)
|
|
||||||
For example, if
|
|
||||||
\fBo\fR
|
|
||||||
and
|
|
||||||
\fB\o'o^'\fR
|
|
||||||
are the members of an equivalence class,
|
|
||||||
then `\fB[[=o=]]\fR', `\fB[[=\o'o^'=]]\fR',
|
|
||||||
and `\fB[o\o'o^']\fR'\&
|
|
||||||
are all synonymous.
|
|
||||||
An equivalence class may not be an endpoint
|
|
||||||
of a range.
|
|
||||||
.VS 8.2
|
|
||||||
(\fINote:\fR
|
|
||||||
Tcl currently implements only the Unicode locale.
|
|
||||||
It doesn't define any equivalence classes.
|
|
||||||
The examples above are just illustrations.)
|
|
||||||
.VE 8.2
|
|
||||||
.PP
|
|
||||||
Within a bracket expression, the name of a \fIcharacter class\fR enclosed
|
|
||||||
in
|
|
||||||
\fB[:\fR
|
|
||||||
and
|
|
||||||
\fB:]\fR
|
|
||||||
stands for the list of all characters
|
|
||||||
(not all collating elements!)
|
|
||||||
belonging to that
|
|
||||||
class.
|
|
||||||
Standard character classes are:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
.ne 5
|
|
||||||
.nf
|
|
||||||
.ta 3c
|
|
||||||
\fBalpha\fR A letter.
|
|
||||||
\fBupper\fR An upper-case letter.
|
|
||||||
\fBlower\fR A lower-case letter.
|
|
||||||
\fBdigit\fR A decimal digit.
|
|
||||||
\fBxdigit\fR A hexadecimal digit.
|
|
||||||
\fBalnum\fR An alphanumeric (letter or digit).
|
|
||||||
\fBprint\fR An alphanumeric (same as alnum).
|
|
||||||
\fBblank\fR A space or tab character.
|
|
||||||
\fBspace\fR A character producing white space in displayed text.
|
|
||||||
\fBpunct\fR A punctuation character.
|
|
||||||
\fBgraph\fR A character with a visible representation.
|
|
||||||
\fBcntrl\fR A control character.
|
|
||||||
.fi
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
A locale may provide others.
|
|
||||||
.VS 8.2
|
|
||||||
(Note that the current Tcl implementation has only one locale:
|
|
||||||
the Unicode locale.)
|
|
||||||
.VE 8.2
|
|
||||||
A character class may not be used as an endpoint of a range.
|
|
||||||
.PP
|
|
||||||
There are two special cases of bracket expressions:
|
|
||||||
the bracket expressions
|
|
||||||
\fB[[:<:]]\fR
|
|
||||||
and
|
|
||||||
\fB[[:>:]]\fR
|
|
||||||
are constraints, matching empty strings at
|
|
||||||
the beginning and end of a word respectively.
|
|
||||||
'\" note, discussion of escapes below references this definition of word
|
|
||||||
A word is defined as a sequence of
|
|
||||||
word characters
|
|
||||||
that is neither preceded nor followed by
|
|
||||||
word characters.
|
|
||||||
A word character is an
|
|
||||||
\fIalnum\fR
|
|
||||||
character
|
|
||||||
or an underscore
|
|
||||||
(\fB_\fR).
|
|
||||||
These special bracket expressions are deprecated;
|
|
||||||
users of AREs should use constraint escapes instead (see below).
|
|
||||||
.SH ESCAPES
|
|
||||||
Escapes (AREs only), which begin with a
|
|
||||||
\fB\e\fR
|
|
||||||
followed by an alphanumeric character,
|
|
||||||
come in several varieties:
|
|
||||||
character entry, class shorthands, constraint escapes, and back references.
|
|
||||||
A
|
|
||||||
\fB\e\fR
|
|
||||||
followed by an alphanumeric character but not constituting
|
|
||||||
a valid escape is illegal in AREs.
|
|
||||||
In EREs, there are no escapes:
|
|
||||||
outside a bracket expression,
|
|
||||||
a
|
|
||||||
\fB\e\fR
|
|
||||||
followed by an alphanumeric character merely stands for that
|
|
||||||
character as an ordinary character,
|
|
||||||
and inside a bracket expression,
|
|
||||||
\fB\e\fR
|
|
||||||
is an ordinary character.
|
|
||||||
(The latter is the one actual incompatibility between EREs and AREs.)
|
|
||||||
.PP
|
|
||||||
Character-entry escapes (AREs only) exist to make it easier to specify
|
|
||||||
non-printing and otherwise inconvenient characters in REs:
|
|
||||||
.RS 2
|
|
||||||
.TP 5
|
|
||||||
\fB\ea\fR
|
|
||||||
alert (bell) character, as in C
|
|
||||||
.TP
|
|
||||||
\fB\eb\fR
|
|
||||||
backspace, as in C
|
|
||||||
.TP
|
|
||||||
\fB\eB\fR
|
|
||||||
synonym for
|
|
||||||
\fB\e\fR
|
|
||||||
to help reduce backslash doubling in some
|
|
||||||
applications where there are multiple levels of backslash processing
|
|
||||||
.TP
|
|
||||||
\fB\ec\fIX\fR
|
|
||||||
(where X is any character) the character whose
|
|
||||||
low-order 5 bits are the same as those of
|
|
||||||
\fIX\fR,
|
|
||||||
and whose other bits are all zero
|
|
||||||
.TP
|
|
||||||
\fB\ee\fR
|
|
||||||
the character whose collating-sequence name
|
|
||||||
is `\fBESC\fR',
|
|
||||||
or failing that, the character with octal value 033
|
|
||||||
.TP
|
|
||||||
\fB\ef\fR
|
|
||||||
formfeed, as in C
|
|
||||||
.TP
|
|
||||||
\fB\en\fR
|
|
||||||
newline, as in C
|
|
||||||
.TP
|
|
||||||
\fB\er\fR
|
|
||||||
carriage return, as in C
|
|
||||||
.TP
|
|
||||||
\fB\et\fR
|
|
||||||
horizontal tab, as in C
|
|
||||||
.TP
|
|
||||||
\fB\eu\fIwxyz\fR
|
|
||||||
(where
|
|
||||||
\fIwxyz\fR
|
|
||||||
is exactly four hexadecimal digits)
|
|
||||||
the Unicode character
|
|
||||||
\fBU+\fIwxyz\fR
|
|
||||||
in the local byte ordering
|
|
||||||
.TP
|
|
||||||
\fB\eU\fIstuvwxyz\fR
|
|
||||||
(where
|
|
||||||
\fIstuvwxyz\fR
|
|
||||||
is exactly eight hexadecimal digits)
|
|
||||||
reserved for a somewhat-hypothetical Unicode extension to 32 bits
|
|
||||||
.TP
|
|
||||||
\fB\ev\fR
|
|
||||||
vertical tab, as in C
|
|
||||||
are all available.
|
|
||||||
.TP
|
|
||||||
\fB\ex\fIhhh\fR
|
|
||||||
(where
|
|
||||||
\fIhhh\fR
|
|
||||||
is any sequence of hexadecimal digits)
|
|
||||||
the character whose hexadecimal value is
|
|
||||||
\fB0x\fIhhh\fR
|
|
||||||
(a single character no matter how many hexadecimal digits are used).
|
|
||||||
.TP
|
|
||||||
\fB\e0\fR
|
|
||||||
the character whose value is
|
|
||||||
\fB0\fR
|
|
||||||
.TP
|
|
||||||
\fB\e\fIxy\fR
|
|
||||||
(where
|
|
||||||
\fIxy\fR
|
|
||||||
is exactly two octal digits,
|
|
||||||
and is not a
|
|
||||||
\fIback reference\fR (see below))
|
|
||||||
the character whose octal value is
|
|
||||||
\fB0\fIxy\fR
|
|
||||||
.TP
|
|
||||||
\fB\e\fIxyz\fR
|
|
||||||
(where
|
|
||||||
\fIxyz\fR
|
|
||||||
is exactly three octal digits,
|
|
||||||
and is not a
|
|
||||||
back reference (see below))
|
|
||||||
the character whose octal value is
|
|
||||||
\fB0\fIxyz\fR
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Hexadecimal digits are `\fB0\fR'-`\fB9\fR', `\fBa\fR'-`\fBf\fR',
|
|
||||||
and `\fBA\fR'-`\fBF\fR'.
|
|
||||||
Octal digits are `\fB0\fR'-`\fB7\fR'.
|
|
||||||
.PP
|
|
||||||
The character-entry escapes are always taken as ordinary characters.
|
|
||||||
For example,
|
|
||||||
\fB\e135\fR
|
|
||||||
is
|
|
||||||
\fB]\fR
|
|
||||||
in ASCII,
|
|
||||||
but
|
|
||||||
\fB\e135\fR
|
|
||||||
does not terminate a bracket expression.
|
|
||||||
Beware, however, that some applications (e.g., C compilers) interpret
|
|
||||||
such sequences themselves before the regular-expression package
|
|
||||||
gets to see them, which may require doubling (quadrupling, etc.) the `\fB\e\fR'.
|
|
||||||
.PP
|
|
||||||
Class-shorthand escapes (AREs only) provide shorthands for certain commonly-used
|
|
||||||
character classes:
|
|
||||||
.RS 2
|
|
||||||
.TP 10
|
|
||||||
\fB\ed\fR
|
|
||||||
\fB[[:digit:]]\fR
|
|
||||||
.TP
|
|
||||||
\fB\es\fR
|
|
||||||
\fB[[:space:]]\fR
|
|
||||||
.TP
|
|
||||||
\fB\ew\fR
|
|
||||||
\fB[[:alnum:]_]\fR
|
|
||||||
(note underscore)
|
|
||||||
.TP
|
|
||||||
\fB\eD\fR
|
|
||||||
\fB[^[:digit:]]\fR
|
|
||||||
.TP
|
|
||||||
\fB\eS\fR
|
|
||||||
\fB[^[:space:]]\fR
|
|
||||||
.TP
|
|
||||||
\fB\eW\fR
|
|
||||||
\fB[^[:alnum:]_]\fR
|
|
||||||
(note underscore)
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
The class-shorthand escapes also work within bracket expressions,
|
|
||||||
although the definitions shown above are not quite syntactically
|
|
||||||
valid in that context.
|
|
||||||
For example, \fB[a-c\ed]\fR is equivalent to \fB[a-c[:digit:]]\fR.
|
|
||||||
.VE 8.2
|
|
||||||
.PP
|
|
||||||
A constraint escape (AREs only) is a constraint,
|
|
||||||
matching the empty string if specific conditions are met,
|
|
||||||
written as an escape:
|
|
||||||
.RS 2
|
|
||||||
.TP 6
|
|
||||||
\fB\eA\fR
|
|
||||||
matches only at the beginning of the string
|
|
||||||
(see MATCHING, below, for how this differs from `\fB^\fR')
|
|
||||||
.TP
|
|
||||||
\fB\em\fR
|
|
||||||
matches only at the beginning of a word
|
|
||||||
.TP
|
|
||||||
\fB\eM\fR
|
|
||||||
matches only at the end of a word
|
|
||||||
.TP
|
|
||||||
\fB\ey\fR
|
|
||||||
matches only at the beginning or end of a word
|
|
||||||
.TP
|
|
||||||
\fB\eY\fR
|
|
||||||
matches only at a point that is not the beginning or end of a word
|
|
||||||
.TP
|
|
||||||
\fB\eZ\fR
|
|
||||||
matches only at the end of the string
|
|
||||||
(see MATCHING, below, for how this differs from `\fB$\fR')
|
|
||||||
.TP
|
|
||||||
\fB\e\fIm\fR
|
|
||||||
(where
|
|
||||||
\fIm\fR
|
|
||||||
is a nonzero digit) a \fIback reference\fR, see below
|
|
||||||
.TP
|
|
||||||
\fB\e\fImnn\fR
|
|
||||||
(where
|
|
||||||
\fIm\fR
|
|
||||||
is a nonzero digit, and
|
|
||||||
\fInn\fR
|
|
||||||
is some more digits,
|
|
||||||
and the decimal value
|
|
||||||
\fImnn\fR
|
|
||||||
is not greater than the number of closing capturing parentheses seen so far)
|
|
||||||
a \fIback reference\fR, see below
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
A word is defined as in the specification of
|
|
||||||
\fB[[:<:]]\fR
|
|
||||||
and
|
|
||||||
\fB[[:>:]]\fR
|
|
||||||
above.
|
|
||||||
Constraint escapes are illegal within bracket expressions.
|
|
||||||
.PP
|
|
||||||
A back reference (AREs only) matches the same string matched by the parenthesized
|
|
||||||
subexpression specified by the number,
|
|
||||||
so that (e.g.)
|
|
||||||
\fB([bc])\e1\fR
|
|
||||||
matches
|
|
||||||
\fBbb\fR
|
|
||||||
or
|
|
||||||
\fBcc\fR
|
|
||||||
but not `\fBbc\fR'.
|
|
||||||
The subexpression must entirely precede the back reference in the RE.
|
|
||||||
Subexpressions are numbered in the order of their leading parentheses.
|
|
||||||
Non-capturing parentheses do not define subexpressions.
|
|
||||||
.PP
|
|
||||||
There is an inherent historical ambiguity between octal character-entry
|
|
||||||
escapes and back references, which is resolved by heuristics,
|
|
||||||
as hinted at above.
|
|
||||||
A leading zero always indicates an octal escape.
|
|
||||||
A single non-zero digit, not followed by another digit,
|
|
||||||
is always taken as a back reference.
|
|
||||||
A multi-digit sequence not starting with a zero is taken as a back
|
|
||||||
reference if it comes after a suitable subexpression
|
|
||||||
(i.e. the number is in the legal range for a back reference),
|
|
||||||
and otherwise is taken as octal.
|
|
||||||
.SH "METASYNTAX"
|
|
||||||
In addition to the main syntax described above, there are some special
|
|
||||||
forms and miscellaneous syntactic facilities available.
|
|
||||||
.PP
|
|
||||||
Normally the flavor of RE being used is specified by
|
|
||||||
application-dependent means.
|
|
||||||
However, this can be overridden by a \fIdirector\fR.
|
|
||||||
If an RE of any flavor begins with `\fB***:\fR',
|
|
||||||
the rest of the RE is an ARE.
|
|
||||||
If an RE of any flavor begins with `\fB***=\fR',
|
|
||||||
the rest of the RE is taken to be a literal string,
|
|
||||||
with all characters considered ordinary characters.
|
|
||||||
.PP
|
|
||||||
An ARE may begin with \fIembedded options\fR:
|
|
||||||
a sequence
|
|
||||||
\fB(?\fIxyz\fB)\fR
|
|
||||||
(where
|
|
||||||
\fIxyz\fR
|
|
||||||
is one or more alphabetic characters)
|
|
||||||
specifies options affecting the rest of the RE.
|
|
||||||
These supplement, and can override,
|
|
||||||
any options specified by the application.
|
|
||||||
The available option letters are:
|
|
||||||
.RS 2
|
|
||||||
.TP 3
|
|
||||||
\fBb\fR
|
|
||||||
rest of RE is a BRE
|
|
||||||
.TP 3
|
|
||||||
\fBc\fR
|
|
||||||
case-sensitive matching (usual default)
|
|
||||||
.TP 3
|
|
||||||
\fBe\fR
|
|
||||||
rest of RE is an ERE
|
|
||||||
.TP 3
|
|
||||||
\fBi\fR
|
|
||||||
case-insensitive matching (see MATCHING, below)
|
|
||||||
.TP 3
|
|
||||||
\fBm\fR
|
|
||||||
historical synonym for
|
|
||||||
\fBn\fR
|
|
||||||
.TP 3
|
|
||||||
\fBn\fR
|
|
||||||
newline-sensitive matching (see MATCHING, below)
|
|
||||||
.TP 3
|
|
||||||
\fBp\fR
|
|
||||||
partial newline-sensitive matching (see MATCHING, below)
|
|
||||||
.TP 3
|
|
||||||
\fBq\fR
|
|
||||||
rest of RE is a literal (``quoted'') string, all ordinary characters
|
|
||||||
.TP 3
|
|
||||||
\fBs\fR
|
|
||||||
non-newline-sensitive matching (usual default)
|
|
||||||
.TP 3
|
|
||||||
\fBt\fR
|
|
||||||
tight syntax (usual default; see below)
|
|
||||||
.TP 3
|
|
||||||
\fBw\fR
|
|
||||||
inverse partial newline-sensitive (``weird'') matching (see MATCHING, below)
|
|
||||||
.TP 3
|
|
||||||
\fBx\fR
|
|
||||||
expanded syntax (see below)
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Embedded options take effect at the
|
|
||||||
\fB)\fR
|
|
||||||
terminating the sequence.
|
|
||||||
They are available only at the start of an ARE,
|
|
||||||
and may not be used later within it.
|
|
||||||
.PP
|
|
||||||
In addition to the usual (\fItight\fR) RE syntax, in which all characters are
|
|
||||||
significant, there is an \fIexpanded\fR syntax,
|
|
||||||
available in all flavors of RE
|
|
||||||
with the \fB-expanded\fR switch, or in AREs with the embedded x option.
|
|
||||||
In the expanded syntax,
|
|
||||||
white-space characters are ignored
|
|
||||||
and all characters between a
|
|
||||||
\fB#\fR
|
|
||||||
and the following newline (or the end of the RE) are ignored,
|
|
||||||
permitting paragraphing and commenting a complex RE.
|
|
||||||
There are three exceptions to that basic rule:
|
|
||||||
.RS 2
|
|
||||||
.PP
|
|
||||||
a white-space character or `\fB#\fR' preceded by `\fB\e\fR' is retained
|
|
||||||
.PP
|
|
||||||
white space or `\fB#\fR' within a bracket expression is retained
|
|
||||||
.PP
|
|
||||||
white space and comments are illegal within multi-character symbols
|
|
||||||
like the ARE `\fB(?:\fR' or the BRE `\fB\e(\fR'
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Expanded-syntax white-space characters are blank, tab, newline, and
|
|
||||||
.VS 8.2
|
|
||||||
any character that belongs to the \fIspace\fR character class.
|
|
||||||
.VE 8.2
|
|
||||||
.PP
|
|
||||||
Finally, in an ARE,
|
|
||||||
outside bracket expressions, the sequence `\fB(?#\fIttt\fB)\fR'
|
|
||||||
(where
|
|
||||||
\fIttt\fR
|
|
||||||
is any text not containing a `\fB)\fR')
|
|
||||||
is a comment,
|
|
||||||
completely ignored.
|
|
||||||
Again, this is not allowed between the characters of
|
|
||||||
multi-character symbols like `\fB(?:\fR'.
|
|
||||||
Such comments are more a historical artifact than a useful facility,
|
|
||||||
and their use is deprecated;
|
|
||||||
use the expanded syntax instead.
|
|
||||||
.PP
|
|
||||||
\fINone\fR of these metasyntax extensions is available if the application
|
|
||||||
(or an initial
|
|
||||||
\fB***=\fR
|
|
||||||
director)
|
|
||||||
has specified that the user's input be treated as a literal string
|
|
||||||
rather than as an RE.
|
|
||||||
.SH MATCHING
|
|
||||||
In the event that an RE could match more than one substring of a given
|
|
||||||
string,
|
|
||||||
the RE matches the one starting earliest in the string.
|
|
||||||
If the RE could match more than one substring starting at that point,
|
|
||||||
its choice is determined by its \fIpreference\fR:
|
|
||||||
either the longest substring, or the shortest.
|
|
||||||
.PP
|
|
||||||
Most atoms, and all constraints, have no preference.
|
|
||||||
A parenthesized RE has the same preference (possibly none) as the RE.
|
|
||||||
A quantified atom with quantifier
|
|
||||||
\fB{\fIm\fB}\fR
|
|
||||||
or
|
|
||||||
\fB{\fIm\fB}?\fR
|
|
||||||
has the same preference (possibly none) as the atom itself.
|
|
||||||
A quantified atom with other normal quantifiers (including
|
|
||||||
\fB{\fIm\fB,\fIn\fB}\fR
|
|
||||||
with
|
|
||||||
\fIm\fR
|
|
||||||
equal to
|
|
||||||
\fIn\fR)
|
|
||||||
prefers longest match.
|
|
||||||
A quantified atom with other non-greedy quantifiers (including
|
|
||||||
\fB{\fIm\fB,\fIn\fB}?\fR
|
|
||||||
with
|
|
||||||
\fIm\fR
|
|
||||||
equal to
|
|
||||||
\fIn\fR)
|
|
||||||
prefers shortest match.
|
|
||||||
A branch has the same preference as the first quantified atom in it
|
|
||||||
which has a preference.
|
|
||||||
An RE consisting of two or more branches connected by the
|
|
||||||
\fB|\fR
|
|
||||||
operator prefers longest match.
|
|
||||||
.PP
|
|
||||||
Subject to the constraints imposed by the rules for matching the whole RE,
|
|
||||||
subexpressions also match the longest or shortest possible substrings,
|
|
||||||
based on their preferences,
|
|
||||||
with subexpressions starting earlier in the RE taking priority over
|
|
||||||
ones starting later.
|
|
||||||
Note that outer subexpressions thus take priority over
|
|
||||||
their component subexpressions.
|
|
||||||
.PP
|
|
||||||
Note that the quantifiers
|
|
||||||
\fB{1,1}\fR
|
|
||||||
and
|
|
||||||
\fB{1,1}?\fR
|
|
||||||
can be used to force longest and shortest preference, respectively,
|
|
||||||
on a subexpression or a whole RE.
|
|
||||||
.PP
|
|
||||||
Match lengths are measured in characters, not collating elements.
|
|
||||||
An empty string is considered longer than no match at all.
|
|
||||||
For example,
|
|
||||||
\fBbb*\fR
|
|
||||||
matches the three middle characters of `\fBabbbc\fR',
|
|
||||||
\fB(week|wee)(night|knights)\fR
|
|
||||||
matches all ten characters of `\fBweeknights\fR',
|
|
||||||
when
|
|
||||||
\fB(.*).*\fR
|
|
||||||
is matched against
|
|
||||||
\fBabc\fR
|
|
||||||
the parenthesized subexpression
|
|
||||||
matches all three characters, and
|
|
||||||
when
|
|
||||||
\fB(a*)*\fR
|
|
||||||
is matched against
|
|
||||||
\fBbc\fR
|
|
||||||
both the whole RE and the parenthesized
|
|
||||||
subexpression match an empty string.
|
|
||||||
.PP
|
|
||||||
If case-independent matching is specified,
|
|
||||||
the effect is much as if all case distinctions had vanished from the
|
|
||||||
alphabet.
|
|
||||||
When an alphabetic that exists in multiple cases appears as an
|
|
||||||
ordinary character outside a bracket expression, it is effectively
|
|
||||||
transformed into a bracket expression containing both cases,
|
|
||||||
so that
|
|
||||||
\fBx\fR
|
|
||||||
becomes `\fB[xX]\fR'.
|
|
||||||
When it appears inside a bracket expression, all case counterparts
|
|
||||||
of it are added to the bracket expression, so that
|
|
||||||
\fB[x]\fR
|
|
||||||
becomes
|
|
||||||
\fB[xX]\fR
|
|
||||||
and
|
|
||||||
\fB[^x]\fR
|
|
||||||
becomes `\fB[^xX]\fR'.
|
|
||||||
.PP
|
|
||||||
If newline-sensitive matching is specified, \fB.\fR
|
|
||||||
and bracket expressions using
|
|
||||||
\fB^\fR
|
|
||||||
will never match the newline character
|
|
||||||
(so that matches will never cross newlines unless the RE
|
|
||||||
explicitly includes a newline)
|
|
||||||
and
|
|
||||||
\fB^\fR
|
|
||||||
and
|
|
||||||
\fB$\fR
|
|
||||||
will match the empty string after and before a newline
|
|
||||||
respectively, in addition to matching at beginning and end of string
|
|
||||||
respectively.
|
|
||||||
ARE
|
|
||||||
\fB\eA\fR
|
|
||||||
and
|
|
||||||
\fB\eZ\fR
|
|
||||||
continue to match beginning or end of string \fIonly\fR.
|
|
||||||
Also, the character class shorthands
|
|
||||||
\fB\eD\fR
|
|
||||||
and
|
|
||||||
\fB\eW\fR
|
|
||||||
will match a newline regardless of this mode.
|
|
||||||
.PP
|
|
||||||
If partial newline-sensitive matching is specified,
|
|
||||||
this affects \fB.\fR
|
|
||||||
and bracket expressions
|
|
||||||
as with newline-sensitive matching, but not
|
|
||||||
\fB^\fR
|
|
||||||
and `\fB$\fR'.
|
|
||||||
.PP
|
|
||||||
If inverse partial newline-sensitive matching is specified,
|
|
||||||
this affects
|
|
||||||
\fB^\fR
|
|
||||||
and
|
|
||||||
\fB$\fR
|
|
||||||
as with
|
|
||||||
newline-sensitive matching,
|
|
||||||
but not \fB.\fR
|
|
||||||
and bracket expressions.
|
|
||||||
This isn't very useful but is provided for symmetry.
|
|
||||||
.SH "LIMITS AND COMPATIBILITY"
|
|
||||||
No particular limit is imposed on the length of REs.
|
|
||||||
Programs intended to be highly portable should not employ REs longer
|
|
||||||
than 256 bytes,
|
|
||||||
as a POSIX-compliant implementation can refuse to accept such REs.
|
|
||||||
.PP
|
|
||||||
The only feature of AREs that is actually incompatible with
|
|
||||||
POSIX EREs is that
|
|
||||||
\fB\e\fR
|
|
||||||
does not lose its special
|
|
||||||
significance inside bracket expressions.
|
|
||||||
All other ARE features use syntax which is illegal or has
|
|
||||||
undefined or unspecified effects in POSIX EREs;
|
|
||||||
the
|
|
||||||
\fB***\fR
|
|
||||||
syntax of directors likewise is outside the POSIX
|
|
||||||
syntax for both BREs and EREs.
|
|
||||||
.PP
|
|
||||||
Many of the ARE extensions are borrowed from Perl, but some have
|
|
||||||
been changed to clean them up, and a few Perl extensions are not present.
|
|
||||||
Incompatibilities of note include `\fB\eb\fR', `\fB\eB\fR',
|
|
||||||
the lack of special treatment for a trailing newline,
|
|
||||||
the addition of complemented bracket expressions to the things
|
|
||||||
affected by newline-sensitive matching,
|
|
||||||
the restrictions on parentheses and back references in lookahead/lookbehind
|
|
||||||
constraints,
|
|
||||||
and the longest/shortest-match (rather than first-match) matching semantics.
|
|
||||||
.PP
|
|
||||||
The matching rules for REs containing both normal and non-greedy quantifiers
|
|
||||||
have changed since early beta-test versions of this package.
|
|
||||||
(The new rules are much simpler and cleaner,
|
|
||||||
but don't work as hard at guessing the user's real intentions.)
|
|
||||||
.PP
|
|
||||||
Henry Spencer's original 1986 \fIregexp\fR package,
|
|
||||||
still in widespread use (e.g., in pre-8.1 releases of Tcl),
|
|
||||||
implemented an early version of today's EREs.
|
|
||||||
There are four incompatibilities between \fIregexp\fR's near-EREs
|
|
||||||
(`RREs' for short) and AREs.
|
|
||||||
In roughly increasing order of significance:
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
In AREs,
|
|
||||||
\fB\e\fR
|
|
||||||
followed by an alphanumeric character is either an
|
|
||||||
escape or an error,
|
|
||||||
while in RREs, it was just another way of writing the
|
|
||||||
alphanumeric.
|
|
||||||
This should not be a problem because there was no reason to write
|
|
||||||
such a sequence in RREs.
|
|
||||||
.PP
|
|
||||||
\fB{\fR
|
|
||||||
followed by a digit in an ARE is the beginning of a bound,
|
|
||||||
while in RREs,
|
|
||||||
\fB{\fR
|
|
||||||
was always an ordinary character.
|
|
||||||
Such sequences should be rare,
|
|
||||||
and will often result in an error because following characters
|
|
||||||
will not look like a valid bound.
|
|
||||||
.PP
|
|
||||||
In AREs,
|
|
||||||
\fB\e\fR
|
|
||||||
remains a special character within `\fB[\|]\fR',
|
|
||||||
so a literal
|
|
||||||
\fB\e\fR
|
|
||||||
within
|
|
||||||
\fB[\|]\fR
|
|
||||||
must be written `\fB\e\e\fR'.
|
|
||||||
\fB\e\e\fR
|
|
||||||
also gives a literal
|
|
||||||
\fB\e\fR
|
|
||||||
within
|
|
||||||
\fB[\|]\fR
|
|
||||||
in RREs,
|
|
||||||
but only truly paranoid programmers routinely doubled the backslash.
|
|
||||||
.PP
|
|
||||||
AREs report the longest/shortest match for the RE,
|
|
||||||
rather than the first found in a specified search order.
|
|
||||||
This may affect some RREs which were written in the expectation that
|
|
||||||
the first match would be reported.
|
|
||||||
(The careful crafting of RREs to optimize the search order for fast
|
|
||||||
matching is obsolete (AREs examine all possible matches
|
|
||||||
in parallel, and their performance is largely insensitive to their
|
|
||||||
complexity) but cases where the search order was exploited to deliberately
|
|
||||||
find a match which was \fInot\fR the longest/shortest will need rewriting.)
|
|
||||||
.RE
|
|
||||||
|
|
||||||
.SH "BASIC REGULAR EXPRESSIONS"
|
|
||||||
BREs differ from EREs in several respects. `\fB|\fR', `\fB+\fR',
|
|
||||||
and
|
|
||||||
\fB?\fR
|
|
||||||
are ordinary characters and there is no equivalent
|
|
||||||
for their functionality.
|
|
||||||
The delimiters for bounds are
|
|
||||||
\fB\e{\fR
|
|
||||||
and `\fB\e}\fR',
|
|
||||||
with
|
|
||||||
\fB{\fR
|
|
||||||
and
|
|
||||||
\fB}\fR
|
|
||||||
by themselves ordinary characters.
|
|
||||||
The parentheses for nested subexpressions are
|
|
||||||
\fB\e(\fR
|
|
||||||
and `\fB\e)\fR',
|
|
||||||
with
|
|
||||||
\fB(\fR
|
|
||||||
and
|
|
||||||
\fB)\fR
|
|
||||||
by themselves ordinary characters.
|
|
||||||
\fB^\fR
|
|
||||||
is an ordinary character except at the beginning of the
|
|
||||||
RE or the beginning of a parenthesized subexpression,
|
|
||||||
\fB$\fR
|
|
||||||
is an ordinary character except at the end of the
|
|
||||||
RE or the end of a parenthesized subexpression,
|
|
||||||
and
|
|
||||||
\fB*\fR
|
|
||||||
is an ordinary character if it appears at the beginning of the
|
|
||||||
RE or the beginning of a parenthesized subexpression
|
|
||||||
(after a possible leading `\fB^\fR').
|
|
||||||
Finally,
|
|
||||||
single-digit back references are available,
|
|
||||||
and
|
|
||||||
\fB\e<\fR
|
|
||||||
and
|
|
||||||
\fB\e>\fR
|
|
||||||
are synonyms for
|
|
||||||
\fB[[:<:]]\fR
|
|
||||||
and
|
|
||||||
\fB[[:>:]]\fR
|
|
||||||
respectively;
|
|
||||||
no other escapes are available.
|
|
||||||
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
RegExp(3), regexp(n), regsub(n), lsearch(n), switch(n), text(n)
|
|
||||||
|
|
||||||
.SH KEYWORDS
|
|
||||||
match, regular expression, string
|
|
Reference in New Issue
Block a user