annotate man/lispref/searching.texi @ 4407:4ee73bbe4f8e

Always use boyer_moore in ASCII or Latin-1 buffers with ASCII search strings. 2007-12-26 Aidan Kehoe <kehoea@parhasard.net> * casetab.c: Extend and correct some case table documentation. * search.c (search_buffer): Correct a bug where only the first entry for a character in the case equivalence table was examined in determining if the Boyer-Moore search algorithm is appropriate. If there are case mappings outside of the charset and row of the characters specified in the search string, those case mappings can be safely ignored (and Boyer-Moore search can be used) if we know from the buffer statistics that the corresponding characters cannot occur. * search.c (boyer_moore): Assert that we haven't been passed a string with varying characters sets or rows within character sets. That's what simple_search is for. In the very rare event that a character in the search string has a canonical case mapping that is not in the same character set and row, don't try to search for the canonical character, search for some other character that is in the the desired character set and row. Assert that the case table isn't corrupt. Do not search for any character case mappings that cannot possibly occur in the buffer, given the buffer metadata about its contents.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 26 Dec 2007 17:30:16 +0100
parents 3660d327399f
children 6772ce4d982b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @setfilename ../../info/searching.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @node Searching and Matching, Syntax Tables, Text, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @chapter Searching and Matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 @cindex searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 XEmacs provides two ways to search through a buffer for specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 text: exact string searches and regular expression searches. After a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 regular expression search, you can examine the @dfn{match data} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 determine which text matched the whole regular expression or various
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 portions of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 * String Search:: Search for an exact match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 * Regular Expressions:: Describing classes of strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 * Regexp Search:: Searching for a match for a regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 * POSIX Regexps:: Searching POSIX-style for the longest match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 * Search and Replace:: Internals of @code{query-replace}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 * Match Data:: Finding out which part of the text matched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 various parts of a regexp, after regexp search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 * Searching and Case:: Case-independent or case-significant searching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 * Standard Regexps:: Useful regexps for finding sentences, pages,...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 The @samp{skip-chars@dots{}} functions also perform a kind of searching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 @xref{Skipping Characters}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 @node String Search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 @section Searching for Strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 @cindex string search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 These are the primitive functions for searching through the text in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 buffer. They are meant for use in programs, but you may call them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 interactively. If you do so, they prompt for the search string;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
38 @var{limit} and @var{noerror} are set to @code{nil}, and @var{count}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 is set to 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
41 @deffn Command search-forward string &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 This function searches forward from point for an exact match for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 @var{string}. If successful, it sets point to the end of the occurrence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 found, and returns the new value of point. If no match is found, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 value and side effects depend on @var{noerror} (see below).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 In the following example, point is initially at the beginning of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 line. Then @code{(search-forward "fox")} moves point after the last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 letter of @samp{fox}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 @point{}The quick brown fox jumped over the lazy dog.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 (search-forward "fox")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 @result{} 20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 The quick brown fox@point{} jumped over the lazy dog.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 The argument @var{limit} specifies the upper bound to the search. (It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 must be a position in the current buffer.) No match extending after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 that position is accepted. If @var{limit} is omitted or @code{nil}, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 defaults to the end of the accessible portion of the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 @kindex search-failed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 What happens when the search fails depends on the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 @var{noerror}. If @var{noerror} is @code{nil}, a @code{search-failed}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 error is signaled. If @var{noerror} is @code{t}, @code{search-forward}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 returns @code{nil} and does nothing. If @var{noerror} is neither
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 @code{nil} nor @code{t}, then @code{search-forward} moves point to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 upper bound and returns @code{nil}. (It would be more consistent now
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 to return the new position of point in that case, but some programs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 may depend on a value of @code{nil}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
83 If @var{count} is supplied (it must be an integer), then the search is
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
84 repeated that many times (each time starting at the end of the previous
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
85 time's match). If @var{count} is negative, the search direction is
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
86 backward. If the successive searches succeed, the function succeeds,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
87 moving point and returning its new value. Otherwise the search fails.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
88
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
89 @var{buffer} is the buffer to search in, and defaults to the current buffer.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
92 @deffn Command search-backward string &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 This function searches backward from point for @var{string}. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 just like @code{search-forward} except that it searches backwards and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 leaves point at the beginning of the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
98 @deffn Command word-search-forward string &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 @cindex word search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 This function searches forward from point for a ``word'' match for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 @var{string}. If it finds a match, it sets point to the end of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 match found, and returns the new value of point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 Word matching regards @var{string} as a sequence of words, disregarding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 punctuation that separates them. It searches the buffer for the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 sequence of words. Each word must be distinct in the buffer (searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 for the word @samp{ball} does not match the word @samp{balls}), but the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 details of punctuation and spacing are ignored (searching for @samp{ball
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 boy} does match @samp{ball. Boy!}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 In this example, point is initially at the beginning of the buffer; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 search leaves it between the @samp{y} and the @samp{!}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 @point{}He said "Please! Find
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 the ball boy!"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (word-search-forward "Please find the ball, boy.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 @result{} 35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 He said "Please! Find
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 the ball boy@point{}!"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 If @var{limit} is non-@code{nil} (it must be a position in the current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 buffer), then it is the upper bound to the search. The match found must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 not extend after that position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 If @var{noerror} is @code{nil}, then @code{word-search-forward} signals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 an error if the search fails. If @var{noerror} is @code{t}, then it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 returns @code{nil} instead of signaling an error. If @var{noerror} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 neither @code{nil} nor @code{t}, it moves point to @var{limit} (or the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 end of the buffer) and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
143 If @var{count} is non-@code{nil}, then the search is repeated that many
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 times. Point is positioned at the end of the last match.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
145
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
146 @var{buffer} is the buffer to search in, and defaults to the current buffer.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
149 @deffn Command word-search-backward string &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 This function searches backward from point for a word match to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 @var{string}. This function is just like @code{word-search-forward}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 except that it searches backward and normally leaves point at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 beginning of the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 @node Regular Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 @section Regular Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 @cindex regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 @cindex regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 A @dfn{regular expression} (@dfn{regexp}, for short) is a pattern that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 denotes a (possibly infinite) set of strings. Searching for matches for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 a regexp is a very powerful operation. This section explains how to write
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 regexps; the following section says how to search for them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 To gain a thorough understanding of regular expressions and how to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 them to best advantage, we recommend that you study @cite{Mastering
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 Regular Expressions, by Jeffrey E.F. Friedl, O'Reilly and Associates,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 1997}. (It's known as the "Hip Owls" book, because of the picture on its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 cover.) You might also read the manuals to @ref{(gawk)Top},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 @ref{(ed)Top}, @cite{sed}, @cite{grep}, @ref{(perl)Top},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 @ref{(regex)Top}, @ref{(rx)Top}, @cite{pcre}, and @ref{(flex)Top}, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 also make good use of regular expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 The XEmacs regular expression syntax most closely resembles that of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 @cite{ed}, or @cite{grep}, the GNU versions of which all utilize the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 @cite{regex} library. XEmacs' version of @cite{regex} has recently been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 extended with some Perl--like capabilities, described in the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 section.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 * Syntax of Regexps:: Rules for writing regular expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 * Regexp Example:: Illustrates regular expression syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 @node Syntax of Regexps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 @subsection Syntax of Regular Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 Regular expressions have a syntax in which a few characters are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 special constructs and the rest are @dfn{ordinary}. An ordinary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 character is a simple regular expression that matches that character and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 nothing else. The special characters are @samp{.}, @samp{*}, @samp{+},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 @samp{?}, @samp{[}, @samp{]}, @samp{^}, @samp{$}, and @samp{\}; no new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 special characters will be defined in the future. Any other character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 appearing in a regular expression is ordinary, unless a @samp{\}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 precedes it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 For example, @samp{f} is not a special character, so it is ordinary, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 therefore @samp{f} is a regular expression that matches the string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 @samp{f} and no other string. (It does @emph{not} match the string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 @samp{ff}.) Likewise, @samp{o} is a regular expression that matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 only @samp{o}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 Any two regular expressions @var{a} and @var{b} can be concatenated. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 result is a regular expression that matches a string if @var{a} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 some amount of the beginning of that string and @var{b} matches the rest of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 the string.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 As a simple example, we can concatenate the regular expressions @samp{f}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 and @samp{o} to get the regular expression @samp{fo}, which matches only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 the string @samp{fo}. Still trivial. To do something more powerful, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 need to use one of the special characters. Here is a list of them:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 @need 1200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 @table @kbd
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 @item .@: @r{(Period)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 @cindex @samp{.} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 is a special character that matches any single character except a newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 Using concatenation, we can make regular expressions like @samp{a.b}, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 matches any three-character string that begins with @samp{a} and ends with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 @samp{b}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 @item *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 @cindex @samp{*} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 is not a construct by itself; it is a quantifying suffix operator that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 means to repeat the preceding regular expression as many times as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 possible. In @samp{fo*}, the @samp{*} applies to the @samp{o}, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 @samp{fo*} matches one @samp{f} followed by any number of @samp{o}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 The case of zero @samp{o}s is allowed: @samp{fo*} does match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 @samp{f}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 @samp{*} always applies to the @emph{smallest} possible preceding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 expression. Thus, @samp{fo*} has a repeating @samp{o}, not a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 repeating @samp{fo}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 The matcher processes a @samp{*} construct by matching, immediately, as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 many repetitions as can be found; it is "greedy". Then it continues
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 with the rest of the pattern. If that fails, backtracking occurs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 discarding some of the matches of the @samp{*}-modified construct in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 case that makes it possible to match the rest of the pattern. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 example, in matching @samp{ca*ar} against the string @samp{caaar}, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 @samp{a*} first tries to match all three @samp{a}s; but the rest of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 pattern is @samp{ar} and there is only @samp{r} left to match, so this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 try fails. The next alternative is for @samp{a*} to match only two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 @samp{a}s. With this choice, the rest of the regexp matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 successfully.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 Nested repetition operators can be extremely slow if they specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 backtracking loops. For example, it could take hours for the regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 expression @samp{\(x+y*\)*a} to match the sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 @samp{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz}. The slowness is because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 Emacs must try each imaginable way of grouping the 35 @samp{x}'s before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 concluding that none of them can work. To make sure your regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 expressions run fast, check nested repetitions carefully.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 @item +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 @cindex @samp{+} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 is a quantifying suffix operator similar to @samp{*} except that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 preceding expression must match at least once. It is also "greedy".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 So, for example, @samp{ca+r} matches the strings @samp{car} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 @samp{caaaar} but not the string @samp{cr}, whereas @samp{ca*r} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 all three strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 @item ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 @cindex @samp{?} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 is a quantifying suffix operator similar to @samp{*}, except that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 preceding expression can match either once or not at all. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 @samp{ca?r} matches @samp{car} or @samp{cr}, but does not match anything
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 @item *?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 @cindex @samp{*?} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 works just like @samp{*}, except that rather than matching the longest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 match, it matches the shortest match. @samp{*?} is known as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 @dfn{non-greedy} quantifier, a regexp construct borrowed from Perl.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 @c Did perl get this from somewhere? What's the real history of *? ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
278 This construct is very useful for when you want to match the text inside
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
279 a pair of delimiters. For instance, @samp{/\*.*?\*/} will match C
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
280 comments in a string. This could not easily be achieved without the use
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
281 of a non-greedy quantifier.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 This construct has not been available prior to XEmacs 20.4. It is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 available in FSF Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 @item +?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 @cindex @samp{+?} in regexp
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
288 is the non-greedy version of @samp{+}.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
289
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
290 @item ??
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
291 @cindex @samp{??} in regexp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
292 is the non-greedy version of @samp{?}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 @item \@{n,m\@}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 @c Note the spacing after the close brace is deliberate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 @cindex @samp{\@{n,m\@} }in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 serves as an interval quantifier, analogous to @samp{*} or @samp{+}, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 specifies that the expression must match at least @var{n} times, but no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 more than @var{m} times. This syntax is supported by most Unix regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 utilities, and has been introduced to XEmacs for the version 20.3.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
302 Unfortunately, the non-greedy version of this quantifier does not exist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
303 currently, although it does in Perl.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
304
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 @item [ @dots{} ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 @cindex character set (in regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 @cindex @samp{[} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 @cindex @samp{]} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 @samp{[} begins a @dfn{character set}, which is terminated by a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 @samp{]}. In the simplest case, the characters between the two brackets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 form the set. Thus, @samp{[ad]} matches either one @samp{a} or one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 @samp{d}, and @samp{[ad]*} matches any string composed of just @samp{a}s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 and @samp{d}s (including the empty string), from which it follows that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 @samp{c[ad]*r} matches @samp{cr}, @samp{car}, @samp{cdr},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 @samp{caddaar}, etc.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 The usual regular expression special characters are not special inside a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 character set. A completely different set of special characters exists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 inside character sets: @samp{]}, @samp{-} and @samp{^}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 @samp{-} is used for ranges of characters. To write a range, write two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 characters with a @samp{-} between them. Thus, @samp{[a-z]} matches any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 lower case letter. Ranges may be intermixed freely with individual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 characters, as in @samp{[a-z$%.]}, which matches any lower case letter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 or @samp{$}, @samp{%}, or a period.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 To include a @samp{]} in a character set, make it the first character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 For example, @samp{[]a]} matches @samp{]} or @samp{a}. To include a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 @samp{-}, write @samp{-} as the first character in the set, or put it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 immediately after a range. (You can replace one individual character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 @var{c} with the range @samp{@var{c}-@var{c}} to make a place to put the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 @samp{-}.) There is no way to write a set containing just @samp{-} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 @samp{]}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 To include @samp{^} in a set, put it anywhere but at the beginning of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 the set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 @item [^ @dots{} ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 @cindex @samp{^} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 @samp{[^} begins a @dfn{complement character set}, which matches any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 character except the ones specified. Thus, @samp{[^a-z0-9A-Z]}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 matches all characters @emph{except} letters and digits.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 @samp{^} is not special in a character set unless it is the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 character. The character following the @samp{^} is treated as if it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 were first (thus, @samp{-} and @samp{]} are not special there).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 Note that a complement character set can match a newline, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 newline is mentioned as one of the characters not to match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 @item ^
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 @cindex @samp{^} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 @cindex beginning of line in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 is a special character that matches the empty string, but only at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 beginning of a line in the text being matched. Otherwise it fails to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 match anything. Thus, @samp{^foo} matches a @samp{foo} that occurs at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 the beginning of a line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 When matching a string instead of a buffer, @samp{^} matches at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 beginning of the string or after a newline character @samp{\n}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 @item $
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 @cindex @samp{$} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 is similar to @samp{^} but matches only at the end of a line. Thus,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 @samp{x+$} matches a string of one @samp{x} or more at the end of a line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 When matching a string instead of a buffer, @samp{$} matches at the end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 of the string or before a newline character @samp{\n}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 @item \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 @cindex @samp{\} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 has two functions: it quotes the special characters (including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 @samp{\}), and it introduces additional special constructs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 Because @samp{\} quotes special characters, @samp{\$} is a regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 expression that matches only @samp{$}, and @samp{\[} is a regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 expression that matches only @samp{[}, and so on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 Note that @samp{\} also has special meaning in the read syntax of Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 strings (@pxref{String Type}), and must be quoted with @samp{\}. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 example, the regular expression that matches the @samp{\} character is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 @samp{\\}. To write a Lisp string that contains the characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 @samp{\\}, Lisp syntax requires you to quote each @samp{\} with another
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 @samp{\}. Therefore, the read syntax for a regular expression matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 @samp{\} is @code{"\\\\"}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 @strong{Please note:} For historical compatibility, special characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 are treated as ordinary ones if they are in contexts where their special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 meanings make no sense. For example, @samp{*foo} treats @samp{*} as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 ordinary since there is no preceding expression on which the @samp{*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 can act. It is poor practice to depend on this behavior; quote the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 special character anyway, regardless of where it appears.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 For the most part, @samp{\} followed by any character matches only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 that character. However, there are several exceptions: characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 that, when preceded by @samp{\}, are special constructs. Such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 characters are always ordinary when encountered on their own. Here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 is a table of @samp{\} constructs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 @table @kbd
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 @item \|
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 @cindex @samp{|} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 @cindex regexp alternative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 specifies an alternative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 Two regular expressions @var{a} and @var{b} with @samp{\|} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 between form an expression that matches anything that either @var{a} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 @var{b} matches.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 Thus, @samp{foo\|bar} matches either @samp{foo} or @samp{bar}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 but no other string.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 @samp{\|} applies to the largest possible surrounding expressions. Only a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 surrounding @samp{\( @dots{} \)} grouping can limit the grouping power of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 @samp{\|}.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 Full backtracking capability exists to handle multiple uses of @samp{\|}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 @item \( @dots{} \)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 @cindex @samp{(} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 @cindex @samp{)} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 @cindex regexp grouping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 is a grouping construct that serves three purposes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 @enumerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 To enclose a set of @samp{\|} alternatives for other operations.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 Thus, @samp{\(foo\|bar\)x} matches either @samp{foox} or @samp{barx}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 To enclose an expression for a suffix operator such as @samp{*} to act
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 on. Thus, @samp{ba\(na\)*} matches @samp{bananana}, etc., with any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (zero or more) number of @samp{na} strings.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 To record a matched substring for future reference.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 @end enumerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 This last application is not a consequence of the idea of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 parenthetical grouping; it is a separate feature that happens to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 assigned as a second meaning to the same @samp{\( @dots{} \)} construct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 because there is no conflict in practice between the two meanings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 Here is an explanation of this feature:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 @item \@var{digit}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 matches the same text that matched the @var{digit}th occurrence of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 @samp{\( @dots{} \)} construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
2255
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
449 In other words, after the end of a @samp{\( @dots{} \)} construct, the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 matcher remembers the beginning and end of the text matched by that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 construct. Then, later on in the regular expression, you can use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 @samp{\} followed by @var{digit} to match that same text, whatever it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 may have been.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 The strings matching the first nine @samp{\( @dots{} \)} constructs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 appearing in a regular expression are assigned numbers 1 through 9 in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 the order that the open parentheses appear in the regular expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 So you can use @samp{\1} through @samp{\9} to refer to the text matched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 by the corresponding @samp{\( @dots{} \)} constructs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 For example, @samp{\(.*\)\1} matches any newline-free string that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 composed of two identical halves. The @samp{\(.*\)} matches the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 half, which may be anything, but the @samp{\1} that follows must match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 the same exact text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 @item \(?: @dots{} \)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 @cindex @samp{\(?:} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 @cindex regexp grouping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 is called a @dfn{shy} grouping operator, and it is used just like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 @samp{\( @dots{} \)}, except that it does not cause the matched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 substring to be recorded for future reference.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 This is useful when you need a lot of grouping @samp{\( @dots{} \)}
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
474 constructs, but only want to remember one or two -- or if you have
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
475 more than nine groupings and need to use backreferences to refer to
2255
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
476 the groupings at the end. It also allows construction of regular
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
477 expressions from variable subexpressions that contain varying numbers of
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
478 non-capturing subexpressions, without disturbing the group counts for
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
479 the main expression. For example
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
480
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
481 @example
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
482 (let ((sre (if foo "\\(?:bar\\|baz\\)" "quux")))
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
483 (re-search-forward (format "a\\(b+ %s c+\\) d" sre) nil t)
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
484 (match-string 1))
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
485 @end example
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
2255
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
487 It is very tedious to write this kind of code without shy groups, even
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
488 if you know what all the alternative subexpressions will look like.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
2255
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
490 Using @samp{\(?: @dots{} \)} rather than @samp{\( @dots{} \)} should
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
491 give little performance gain, as the start of each group must be
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
492 recorded for the purpose of back-tracking in any case, and no string
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
493 copying is done until @code{match-string} is called.
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
494
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
495 The shy grouping operator has been borrowed from Perl, and was not
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
496 available prior to XEmacs 20.3, and has only been available in GNU Emacs
03d9d549c3fa [xemacs-hg @ 2004-09-08 10:32:50 by stephent]
stephent
parents: 1495
diff changeset
497 since version 21.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 @item \w
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 @cindex @samp{\w} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 matches any word-constituent character. The editor syntax table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 determines which characters these are. @xref{Syntax Tables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 @item \W
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 @cindex @samp{\W} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 matches any character that is not a word constituent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 @item \s@var{code}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 @cindex @samp{\s} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 matches any character whose syntax is @var{code}. Here @var{code} is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 character that represents a syntax code: thus, @samp{w} for word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 constituent, @samp{-} for whitespace, @samp{(} for open parenthesis,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 etc. @xref{Syntax Tables}, for a list of syntax codes and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 characters that stand for them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 @item \S@var{code}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 @cindex @samp{\S} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 matches any character whose syntax is not @var{code}.
2608
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
519
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
520 @item \c@var{category}
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
521 @cindex @samp{\c} in regexp
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
522 matches any character in @var{category}. Only available under Mule,
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
523 categories, and category tables, are further described in @ref{Category
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
524 Tables}. They are a mechanism for constructing classes of characters
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
525 that can be local to a buffer, and that do not require complicated []
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
526 expressions every time they are referenced.
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
527
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
528 @item \C@var{category}
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
529 @cindex @samp{\C} in regexp
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
530 matches any character outside @var{category}. @xref{Category Tables},
f45ce138f2ad [xemacs-hg @ 2005-02-23 15:33:32 by stephent]
stephent
parents: 2255
diff changeset
531 again, and note that this is only available under Mule.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 The following regular expression constructs match the empty string---that is,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 they don't use up any characters---but whether they match depends on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 context.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 @table @kbd
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 @item \`
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 @cindex @samp{\`} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 matches the empty string, but only at the beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 of the buffer or string being matched against.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 @item \'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 @cindex @samp{\'} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 matches the empty string, but only at the end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 the buffer or string being matched against.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 @item \=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 @cindex @samp{\=} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 matches the empty string, but only at point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (This construct is not defined when matching against a string.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 @item \b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 @cindex @samp{\b} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 matches the empty string, but only at the beginning or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 end of a word. Thus, @samp{\bfoo\b} matches any occurrence of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 @samp{foo} as a separate word. @samp{\bballs?\b} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 @samp{ball} or @samp{balls} as a separate word.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 @item \B
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 @cindex @samp{\B} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 matches the empty string, but @emph{not} at the beginning or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 end of a word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 @item \<
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 @cindex @samp{\<} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 matches the empty string, but only at the beginning of a word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 @item \>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 @cindex @samp{\>} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 matches the empty string, but only at the end of a word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 @kindex invalid-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 Not every string is a valid regular expression. For example, a string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 with unbalanced square brackets is invalid (with a few exceptions, such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 as @samp{[]]}), and so is a string that ends with a single @samp{\}. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 an invalid regular expression is passed to any of the search functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 an @code{invalid-regexp} error is signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 @defun regexp-quote string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 This function returns a regular expression string that matches exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 @var{string} and nothing else. This allows you to request an exact
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 string match when calling a function that wants a regular expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 (regexp-quote "^The cat$")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 @result{} "\\^The cat\\$"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 One use of @code{regexp-quote} is to combine an exact string match with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 context described as a regular expression. For example, this searches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 for the string that is the value of @code{string}, surrounded by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 whitespace:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (re-search-forward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (concat "\\s-" (regexp-quote string) "\\s-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 @node Regexp Example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 @subsection Complex Regexp Example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 Here is a complicated regexp, used by XEmacs to recognize the end of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 sentence together with any whitespace that follows. It is the value of
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
612 the variable @code{sentence-end}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 First, we show the regexp as a string in Lisp syntax to distinguish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 spaces from tab characters. The string constant begins and ends with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 double-quote. @samp{\"} stands for a double-quote as part of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 string, @samp{\\} for a backslash as part of the string, @samp{\t} for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 tab and @samp{\n} for a newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 "[.?!][]\"')@}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 In contrast, if you evaluate the variable @code{sentence-end}, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 will see the following:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 sentence-end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 @result{}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
631 "[.?!][]\"')@}]*\\($\\| $\\| \\| \\)[
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 ]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 In this output, tab and newline appear as themselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 This regular expression contains four parts in succession and can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 deciphered as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 @item [.?!]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 The first part of the pattern is a character set that matches any one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 three characters: period, question mark, and exclamation mark. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 match must begin with one of these three characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 @item []\"')@}]*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 The second part of the pattern matches any closing braces and quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 marks, zero or more of them, that may follow the period, question mark
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 or exclamation mark. The @code{\"} is Lisp syntax for a double-quote in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 a string. The @samp{*} at the end indicates that the immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 preceding regular expression (a character set, in this case) may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 repeated zero or more times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 @item \\($\\|@ $\\|\t\\|@ @ \\)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 The third part of the pattern matches the whitespace that follows the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 end of a sentence: the end of a line, or a tab, or two spaces. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 double backslashes mark the parentheses and vertical bars as regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 expression syntax; the parentheses delimit a group and the vertical bars
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 separate alternatives. The dollar sign is used to match the end of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 @item [ \t\n]*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 Finally, the last part of the pattern matches any additional whitespace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 beyond the minimum needed to end a sentence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 @node Regexp Search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 @section Regular Expression Searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 @cindex regular expression searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 @cindex regexp searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 @cindex searching for regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 In XEmacs, you can search for the next match for a regexp either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 incrementally or not. Incremental search commands are described in the
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
677 @cite{The XEmacs Lisp Reference Manual}. @xref{Regexp Search, , Regular Expression
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
678 Search, xemacs, The XEmacs Lisp Reference Manual}. Here we describe only the search
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 functions useful in programs. The principal one is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 @code{re-search-forward}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
682 @deffn Command re-search-forward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 This function searches forward in the current buffer for a string of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 text that is matched by the regular expression @var{regexp}. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 function skips over any amount of text that is not matched by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 @var{regexp}, and leaves point at the end of the first match found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 It returns the new value of point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 If @var{limit} is non-@code{nil} (it must be a position in the current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 buffer), then it is the upper bound to the search. No match extending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 after that position is accepted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 What happens when the search fails depends on the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 @var{noerror}. If @var{noerror} is @code{nil}, a @code{search-failed}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 error is signaled. If @var{noerror} is @code{t},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 @code{re-search-forward} does nothing and returns @code{nil}. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 @var{noerror} is neither @code{nil} nor @code{t}, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 @code{re-search-forward} moves point to @var{limit} (or the end of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 buffer) and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
701 If @var{count} is supplied (it must be a positive number), then the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 search is repeated that many times (each time starting at the end of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 previous time's match). If these successive searches succeed, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 function succeeds, moving point and returning its new value. Otherwise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 the search fails.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 In the following example, point is initially before the @samp{T}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 Evaluating the search call moves point to the end of that line (between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 the @samp{t} of @samp{hat} and the newline).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 I read "@point{}The cat in the hat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 (re-search-forward "[a-z]+" nil t 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 @result{} 27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 I read "The cat in the hat@point{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
731 @deffn Command re-search-backward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 This function searches backward in the current buffer for a string of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 text that is matched by the regular expression @var{regexp}, leaving
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 point at the beginning of the first text found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 This function is analogous to @code{re-search-forward}, but they are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 simple mirror images. @code{re-search-forward} finds the match whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 beginning is as close as possible to the starting point. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 @code{re-search-backward} were a perfect mirror image, it would find the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 match whose end is as close as possible. However, in fact it finds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 match whose beginning is as close as possible. The reason is that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 matching a regular expression at a given spot always works from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 beginning to end, and starts at a specified beginning position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 A true mirror-image of @code{re-search-forward} would require a special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 feature for matching regexps from end to beginning. It's not worth the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 trouble of implementing that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
750 @defun string-match regexp string &optional start buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 This function returns the index of the start of the first match for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 the regular expression @var{regexp} in @var{string}, or @code{nil} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 there is no match. If @var{start} is non-@code{nil}, the search starts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 at that index in @var{string}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
756
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
757 Optional arg @var{buffer} controls how case folding is done (according
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
758 to the value of @code{case-fold-search} in @var{buffer} and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
759 @var{buffer}'s case tables) and defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
760
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 "quick" "The quick brown fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 "quick" "The quick brown fox jumped quickly." 8)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 @result{} 27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 The index of the first character of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 string is 0, the index of the second character is 1, and so on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 After this function returns, the index of the first character beyond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 the match is available as @code{(match-end 0)}. @xref{Match Data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 "quick" "The quick brown fox jumped quickly." 8)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 @result{} 27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 (match-end 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 @result{} 32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
797 The function @code{split-string} can be used to parse a string into
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
798 components delimited by text matching a regular expression.
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
799
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
800 @defvar split-string-default-separators
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
801 The default value of @var{separators} for @code{split-string}, initially
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
802 @samp{"[ \f\t\n\r\v]+"}.
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
803 @end defvar
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
804
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
805 @defun split-string string &optional separators omit-nulls
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
806 This function splits @var{string} into substrings delimited by matches
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
807 for the regular expression @var{separators}. Each match for
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
808 @var{separators} defines a splitting point; the substrings between the
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
809 splitting points are made into a list, which is the value returned by
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
810 @code{split-string}. If @var{omit-nulls} is @code{t}, null strings will
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
811 be removed from the result list. Otherwise, null strings are left in
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
812 the result. If @var{separators} is @code{nil} (or omitted), the default
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
813 is the value of @code{split-string-default-separators}.
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
814
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
815 As a special case, when @var{separators} is @code{nil} (or omitted),
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
816 null strings are always omitted from the result. Thus:
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
817
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
818 @example
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
819 (split-string " two words ")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
820 @result{} ("two" "words")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
821 @end example
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
822
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
823 The result is not @samp{("" "two" "words" "")}, which would rarely be
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
824 useful. If you need such a result, use an explict value for
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
825 @var{separators}:
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
826
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
827 @example
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
828 (split-string " two words " split-string-default-separators)
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
829 @result{} ("" "two" "words" "")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
830 @end example
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
831
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
832 A few examples (there are more in the regression tests):
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 @group
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
836 (split-string "foo" "")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
837 @result{} ("" "f" "o" "o" "")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
838 @end group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
839 @group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
840 (split-string "foo" "^")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
841 @result{} ("" "foo")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
842 @end group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
843 @group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
844 (split-string "foo" "$")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
845 @result{} ("foo" ""))
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
846 @end group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
847 @group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
848 (split-string "foo,bar" ",")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 @result{} ("foo" "bar")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 @group
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
852 (split-string ",foo,bar," ",")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
853 @result{} ("" "foo" "bar" "")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 @group
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
856 (split-string ",foo,bar," "^,")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
857 @result{} ("" "foo,bar,")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 @group
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
860 (split-string "foo,bar" "," t)
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
861 @result{} ("foo" "bar")
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
862 @end group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
863 @group
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
864 (split-string ",foo,bar," "," t)
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1468
diff changeset
865 @result{} ("foo" "bar")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 @defun split-path path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 This function splits a search path into a list of strings. The path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 components are separated with the characters specified with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 @code{path-separator}. Under Unix, @code{path-separator} will normally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 be @samp{:}, while under Windows, it will be @samp{;}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
877 @defun looking-at regexp &optional buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 This function determines whether the text in the current buffer directly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 following point matches the regular expression @var{regexp}. ``Directly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 following'' means precisely that: the search is ``anchored'' and it can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 succeed only starting with the first character following point. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 result is @code{t} if so, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 This function does not move point, but it updates the match data, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 you can access using @code{match-beginning} and @code{match-end}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 @xref{Match Data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 In this example, point is located directly before the @samp{T}. If it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 were anywhere else, the result would be @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 I read "@point{}The cat in the hat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (looking-at "The cat in the hat$")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 @node POSIX Regexps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 @section POSIX Regular Expression Searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 The usual regular expression functions do backtracking when necessary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 to handle the @samp{\|} and repetition constructs, but they continue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 this only until they find @emph{some} match. Then they succeed and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 report the first match found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 This section describes alternative search functions which perform the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 full backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 matching. They continue backtracking until they have tried all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 possibilities and found all matches, so they can report the longest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 match, as required by POSIX. This is much slower, so use these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 functions only when you really need the longest match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 In Emacs versions prior to 19.29, these functions did not exist, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 the functions described above implemented full POSIX backtracking.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
922 @deffn Command posix-search-forward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 This is like @code{re-search-forward} except that it performs the full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 matching.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
926 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
928 @deffn Command posix-search-backward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 This is like @code{re-search-backward} except that it performs the full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 matching.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
932 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
934 @defun posix-looking-at regexp &optional buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 This is like @code{looking-at} except that it performs the full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 matching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
940 @defun posix-string-match regexp string &optional start buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 This is like @code{string-match} except that it performs the full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 matching.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
944
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
945 Optional arg @var{buffer} controls how case folding is done (according
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
946 to the value of @code{case-fold-search} in @var{buffer} and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
947 @var{buffer}'s case tables) and defaults to the current buffer.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 @deffn Command delete-matching-lines regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 This function is identical to @code{delete-non-matching-lines}, save
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 that it deletes what @code{delete-non-matching-lines} keeps.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 In the example below, point is located on the first line of text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 We hold these truths
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 to be self-evident,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 that all men are created
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 equal, and that they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 (delete-matching-lines "the")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 to be self-evident,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 that all men are created
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 @deffn Command flush-lines regexp
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
980 This function is an alias of @code{delete-matching-lines}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
983 @deffn Command delete-non-matching-lines regexp
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 This function deletes all lines following point which don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 contain a match for the regular expression @var{regexp}.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
986 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 @deffn Command keep-lines regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 This function is the same as @code{delete-non-matching-lines}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
992 @deffn Command count-matches regexp
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 This function counts the number of matches for @var{regexp} there are in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 the current buffer following point. It prints this number in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 the echo area, returning the string printed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
998 @deffn Command how-many regexp
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
999 This function is an alias of @code{count-matches}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1002 @deffn Command list-matching-lines regexp &optional nlines
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 This function is a synonym of @code{occur}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 Show all lines following point containing a match for @var{regexp}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 Display each line with @var{nlines} lines before and after,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 or @code{-}@var{nlines} before if @var{nlines} is negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 @var{nlines} defaults to @code{list-matching-lines-default-context-lines}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 Interactively it is the prefix arg.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 The lines are shown in a buffer named @samp{*Occur*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 It serves as a menu to find any of the occurrences in this buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 @kbd{C-h m} (@code{describe-mode} in that buffer gives help.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 @defopt list-matching-lines-default-context-lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 Default value is 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 Default number of context lines to include around a @code{list-matching-lines}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 match. A negative number means to include that many lines before the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 A positive number means to include that many lines both before and after.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 @node Search and Replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 @section Search and Replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 @cindex replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 @defun perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 This function is the guts of @code{query-replace} and related commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 It searches for occurrences of @var{from-string} and replaces some or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 all of them. If @var{query-flag} is @code{nil}, it replaces all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 occurrences; otherwise, it asks the user what to do about each one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 If @var{regexp-flag} is non-@code{nil}, then @var{from-string} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 considered a regular expression; otherwise, it must match literally. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 @var{delimited-flag} is non-@code{nil}, then only replacements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 surrounded by word boundaries are considered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 The argument @var{replacements} specifies what to replace occurrences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 with. If it is a string, that string is used. It can also be a list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 strings, to be used in cyclic order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 If @var{repeat-count} is non-@code{nil}, it should be an integer. Then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 it specifies how many times to use each of the strings in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 @var{replacements} list before advancing cyclicly to the next one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 Normally, the keymap @code{query-replace-map} defines the possible user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 responses for queries. The argument @var{map}, if non-@code{nil}, is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 keymap to use instead of @code{query-replace-map}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 @defvar query-replace-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 This variable holds a special keymap that defines the valid user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 responses for @code{query-replace} and related functions, as well as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 @code{y-or-n-p} and @code{map-y-or-n-p}. It is unusual in two ways:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 The ``key bindings'' are not commands, just symbols that are meaningful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 to the functions that use this map.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 Prefix keys are not supported; each key binding must be for a single event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 key sequence. This is because the functions don't use read key sequence to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 get the input; instead, they read a single event and look it up ``by hand.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 Here are the meaningful ``bindings'' for @code{query-replace-map}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 Several of them are meaningful only for @code{query-replace} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 friends.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 @item act
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 Do take the action being considered---in other words, ``yes.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 @item skip
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 Do not take action for this question---in other words, ``no.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 @item exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 Answer this question ``no,'' and give up on the entire series of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 questions, assuming that the answers will be ``no.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 @item act-and-exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 Answer this question ``yes,'' and give up on the entire series of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 questions, assuming that subsequent answers will be ``no.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 @item act-and-show
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 Answer this question ``yes,'' but show the results---don't advance yet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 to the next question.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 @item automatic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 Answer this question and all subsequent questions in the series with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 ``yes,'' without further user interaction.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 @item backup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 Move back to the previous place that a question was asked about.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 @item edit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 Enter a recursive edit to deal with this question---instead of any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 other action that would normally be taken.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 @item delete-and-edit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 Delete the text being considered, then enter a recursive edit to replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 @item recenter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 Redisplay and center the window, then ask the same question again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 @item quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 Perform a quit right away. Only @code{y-or-n-p} and related functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 use this answer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 @item help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 Display some help, then ask again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 @node Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 @section The Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 @cindex match data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 XEmacs keeps track of the positions of the start and end of segments of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 text found during a regular expression search. This means, for example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 that you can search for a complex pattern, such as a date in an Rmail
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 message, and then extract parts of the match under control of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126
1468
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1127 Because the match data normally describe the most recent successful
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1128 search only, you must be careful not to do another search inadvertently
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1129 between the search you wish to refer back to and the use of the match
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1130 data. If you can't avoid another intervening search, you must save and
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1131 restore the match data around it, to prevent it from being overwritten.
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1132
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1133 To make it possible to write iterative or recursive code that repeatedly
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1134 searches, and uses the data from the last successful search when no more
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1135 matches can be found, a search or match which fails will preserve the
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1136 match data from the last successful search. (You must not depend on
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1137 match data being preserved in case the search or match signals an
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1138 error.) If for some reason you need to clear the match data, you may
0f42689481f0 [xemacs-hg @ 2003-05-09 14:52:37 by stephent]
stephent
parents: 446
diff changeset
1139 use @code{(store-match-data nil)}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 * Simple Match Data:: Accessing single items of match data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 such as where a particular subexpression started.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 * Replacing Match:: Replacing a substring that was matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 * Entire Match Data:: Accessing the entire match data at once, as a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 * Saving Match Data:: Saving and restoring the match data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 @node Simple Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 @subsection Simple Match Data Access
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 This section explains how to use the match data to find out what was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 matched by the last search or match operation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 You can ask about the entire matching text, or about a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 parenthetical subexpression of a regular expression. The @var{count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 argument in the functions below specifies which. If @var{count} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 zero, you are asking about the entire match. If @var{count} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 positive, it specifies which subexpression you want.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 Recall that the subexpressions of a regular expression are those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 expressions grouped with escaped parentheses, @samp{\(@dots{}\)}. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 @var{count}th subexpression is found by counting occurrences of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 @samp{\(} from the beginning of the whole regular expression. The first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 subexpression is numbered 1, the second 2, and so on. Only regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 expressions can have subexpressions---after a simple string search, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 only information available is about the entire match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 @defun match-string count &optional in-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 This function returns, as a string, the text matched in the last search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 or match operation. It returns the entire text if @var{count} is zero,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 or just the portion corresponding to the @var{count}th parenthetical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 subexpression, if @var{count} is positive. If @var{count} is out of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 range, or if that subexpression didn't match anything, the value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 If the last such operation was done against a string with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 @code{string-match}, then you should pass the same string as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 argument @var{in-string}. Otherwise, after a buffer search or match,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 you should omit @var{in-string} or pass @code{nil} for it; but you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 should make sure that the current buffer when you call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 @code{match-string} is the one in which you did the searching or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 matching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 @defun match-beginning count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 This function returns the position of the start of text matched by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 last regular expression searched for, or a subexpression of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 If @var{count} is zero, then the value is the position of the start of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 the entire match. Otherwise, @var{count} specifies a subexpression in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 the regular expression, and the value of the function is the starting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 position of the match for that subexpression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 The value is @code{nil} for a subexpression inside a @samp{\|}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 alternative that wasn't used in the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 @defun match-end count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 This function is like @code{match-beginning} except that it returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 position of the end of the match, rather than the position of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 beginning.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 Here is an example of using the match data, with a comment showing the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 positions within the text:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 (string-match "\\(qu\\)\\(ick\\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 "The quick fox jumped quickly.")
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1212 ;0123456789
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 (match-string 0 "The quick fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 @result{} "quick"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 (match-string 1 "The quick fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 @result{} "qu"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 (match-string 2 "The quick fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 @result{} "ick"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 (match-beginning 1) ; @r{The beginning of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 @result{} 4 ; @r{with @samp{qu} is at index 4.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 (match-beginning 2) ; @r{The beginning of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 @result{} 6 ; @r{with @samp{ick} is at index 6.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 (match-end 1) ; @r{The end of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 @result{} 6 ; @r{with @samp{qu} is at index 6.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 (match-end 2) ; @r{The end of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 @result{} 9 ; @r{with @samp{ick} is at index 9.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 Here is another example. Point is initially located at the beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 of the line. Searching moves point to between the space and the word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 @samp{in}. The beginning of the entire match is at the 9th character of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 the buffer (@samp{T}), and the beginning of the match for the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 subexpression is at the 13th character (@samp{c}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 (re-search-forward "The \\(cat \\)")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 (match-beginning 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 (match-beginning 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 @result{} (9 9 13)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 I read "The cat @point{}in the hat comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 ^ ^
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 9 13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 (In this case, the index returned is a buffer position; the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 character of the buffer counts as 1.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 @node Replacing Match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 @subsection Replacing the Text That Matched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 This function replaces the text matched by the last search with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 @var{replacement}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 @cindex case in replacements
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1279 @defun replace-match replacement &optional fixedcase literal string strbuffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 This function replaces the text in the buffer (or in @var{string}) that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 was matched by the last search. It replaces that text with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 @var{replacement}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 If you did the last search in a buffer, you should specify @code{nil}
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1285 for @var{string}. (An error will be signaled if you don't.) Then
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1286 @code{replace-match} does the replacement by editing the buffer; it
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1287 leaves point at the end of the replacement text, and returns @code{t}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 If you did the search in a string, pass the same string as @var{string}.
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1290 (An error will be signaled if you specify nil.) Then
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1291 @code{replace-match} does the replacement by constructing and returning
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1292 a new string.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1293
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 If @var{fixedcase} is non-@code{nil}, then the case of the replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 text is not changed; otherwise, the replacement text is converted to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 different case depending upon the capitalization of the text to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 replaced. If the original text is all upper case, the replacement text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 is converted to upper case. If the first word of the original text is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 capitalized, then the first word of the replacement text is capitalized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 If the original text contains just one word, and that word is a capital
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 letter, @code{replace-match} considers this a capitalized first word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 rather than all upper case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 If @code{case-replace} is @code{nil}, then case conversion is not done,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1305 regardless of the value of @var{fixedcase}. @xref{Searching and Case}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 If @var{literal} is non-@code{nil}, then @var{replacement} is inserted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 exactly as it is, the only alterations being case changes as needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 If it is @code{nil} (the default), then the character @samp{\} is treated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 specially. If a @samp{\} appears in @var{replacement}, then it must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 part of one of the following sequences:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 @table @asis
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 @item @samp{\&}
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1315 @cindex @samp{\&} in replacement
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 @samp{\&} stands for the entire text being replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 @item @samp{\@var{n}}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 @cindex @samp{\@var{n}} in replacement
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1320 @cindex @samp{\@var{digit}} in replacement
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 @samp{\@var{n}}, where @var{n} is a digit, stands for the text that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 matched the @var{n}th subexpression in the original regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 Subexpressions are those expressions grouped inside @samp{\(@dots{}\)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 @item @samp{\\}
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1326 @cindex @samp{\\} in replacement
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 @samp{\\} stands for a single @samp{\} in the replacement text.
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1328
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1329 @item @samp{\u}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1330 @cindex @samp{\u} in replacement
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1331 @samp{\u} means upcase the next character.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1332
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1333 @item @samp{\l}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1334 @cindex @samp{\l} in replacement
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1335 @samp{\l} means downcase the next character.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1336
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1337 @item @samp{\U}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1338 @cindex @samp{\U} in replacement
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1339 @samp{\U} means begin upcasing all following characters.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1340
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1341 @item @samp{\L}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1342 @cindex @samp{\L} in replacement
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1343 @samp{\L} means begin downcasing all following characters.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1344
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1345 @item @samp{\E}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1346 @cindex @samp{\E} in replacement
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1347 @samp{\E} means terminate the effect of any @samp{\U} or @samp{\L}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 @end table
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1349
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1350 Case changes made with @samp{\u}, @samp{\l}, @samp{\U}, and @samp{\L}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1351 override all other case changes that may be made in the replaced text.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1352
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1353 The fifth argument @var{strbuffer} may be a buffer to be used for
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1354 syntax-table and case-table lookup. If @var{strbuffer} is not a buffer,
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1355 the current buffer is used. When @var{string} is not a string, the
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1356 buffer that the match occurred in has automatically been remembered and
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1357 you do not need to specify it. @var{string} may also be an integer,
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1358 specifying the index of the subexpression to match. When @var{string}
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1359 is not an integer, the ``subexpression'' is 0, @emph{i.e.}, the whole
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1360 match. An @code{invalid-argument} error will be signaled if you specify
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1361 a buffer when @var{string} is nil, or specify a subexpression which was
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1362 not matched.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1363
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1364 It is not possible to specify both a buffer and a subexpression, but the
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1365 idiom
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1366 @example
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1367 (with-current-buffer @var{buffer} (replace-match ... @var{integer}))
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1368 @end example
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1369 may be used.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1370
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 2608
diff changeset
1373
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 @node Entire Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 @subsection Accessing the Entire Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 The functions @code{match-data} and @code{set-match-data} read or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 write the entire match data, all at once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1380 @defun match-data &optional integers reuse
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 This function returns a newly constructed list containing all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 information on what text the last search matched. Element zero is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 position of the beginning of the match for the whole expression; element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 one is the position of the end of the match for the expression. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 next two elements are the positions of the beginning and end of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 match for the first subexpression, and so on. In general, element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 number 2@var{n}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 @tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 number {\mathsurround=0pt $2n$}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 @end tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 corresponds to @code{(match-beginning @var{n})}; and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 number 2@var{n} + 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 @tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 number {\mathsurround=0pt $2n+1$}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 @end tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 corresponds to @code{(match-end @var{n})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 All the elements are markers or @code{nil} if matching was done on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 buffer, and all are integers or @code{nil} if matching was done on a
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1405 string with @code{string-match}. However, if the optional first
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1406 argument @var{integers} is non-@code{nil}, always use integers (rather
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1407 than markers) to represent buffer positions.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1408
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1409 If the optional second argument @var{reuse} is a list, reuse it as part
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1410 of the value. If @var{reuse} is long enough to hold all the values, and if
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1411 @var{integers} is non-@code{nil}, no new lisp objects are created.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 As always, there must be no possibility of intervening searches between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 the call to a search function and the call to @code{match-data} that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 intended to access the match data for that search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 (match-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 @result{} (#<marker at 9 in foo>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 #<marker at 17 in foo>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 #<marker at 13 in foo>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 #<marker at 17 in foo>)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 @defun set-match-data match-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 This function sets the match data from the elements of @var{match-list},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 which should be a list that was the value of a previous call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 @code{match-data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 If @var{match-list} refers to a buffer that doesn't exist, you don't get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 an error; that sets the match data in a meaningless but harmless way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 @findex store-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 @code{store-match-data} is an alias for @code{set-match-data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 @node Saving Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 @subsection Saving and Restoring the Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 When you call a function that may do a search, you may need to save
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 and restore the match data around that call, if you want to preserve the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 match data from an earlier search for later use. Here is an example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 that shows the problem that arises if you fail to save the match data:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 (re-search-forward "The \\(cat \\)")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 @result{} 48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 (foo) ; @r{Perhaps @code{foo} does}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 ; @r{more searching.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 (match-end 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 @result{} 61 ; @r{Unexpected result---not 48!}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 You can save and restore the match data with @code{save-match-data}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1461 @defspec save-match-data body@dots{}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 This special form executes @var{body}, saving and restoring the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 data around it.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1464 @end defspec
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 You can use @code{set-match-data} together with @code{match-data} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 imitate the effect of the special form @code{save-match-data}. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 useful for writing code that can run in Emacs 18. Here is how:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 (let ((data (match-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 @dots{} ; @r{May change the original match data.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 (set-match-data data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 Emacs automatically saves and restores the match data when it runs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 process filter functions (@pxref{Filter Functions}) and process
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 sentinels (@pxref{Sentinels}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 Here is a function which restores the match data provided the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 associated with it still exists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 (defun restore-match-data (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 @c It is incorrect to split the first line of a doc string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 @c If there's a problem here, it should be solved in some other way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 "Restore the match data DATA unless the buffer is missing."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 (catch 'foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 (let ((d data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 (while d
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 (and (car d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 (null (marker-buffer (car d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 ;; @file{match-data} @r{buffer is deleted.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 (throw 'foo nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 (setq d (cdr d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 (set-match-data data))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 @node Searching and Case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 @section Searching and Case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 @cindex searching and case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 By default, searches in Emacs ignore the case of the text they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 searching through; if you specify searching for @samp{FOO}, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 @samp{Foo} or @samp{foo} is also considered a match. Regexps, and in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 particular character sets, are included: thus, @samp{[aB]} would match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 @samp{a} or @samp{A} or @samp{b} or @samp{B}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 If you do not want this feature, set the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 @code{case-fold-search} to @code{nil}. Then all letters must match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 exactly, including case. This is a buffer-local variable; altering the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 variable affects only the current buffer. (@xref{Intro to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 Buffer-Local}.) Alternatively, you may change the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 @code{default-case-fold-search}, which is the default value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 @code{case-fold-search} for buffers that do not override it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 Note that the user-level incremental search feature handles case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 distinctions differently. When given a lower case letter, it looks for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 a match of either case, but when given an upper case letter, it looks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 for an upper case letter only. But this has nothing to do with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 searching functions Lisp functions use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 @defopt case-replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 This variable determines whether the replacement functions should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 preserve case. If the variable is @code{nil}, that means to use the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 replacement text verbatim. A non-@code{nil} value means to convert the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 case of the replacement text according to the text being replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 The function @code{replace-match} is where this variable actually has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 its effect. @xref{Replacing Match}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 @defopt case-fold-search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 This buffer-local variable determines whether searches should ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 case. If the variable is @code{nil} they do not ignore case; otherwise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 they do ignore case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 @defvar default-case-fold-search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 The value of this variable is the default value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 @code{case-fold-search} in buffers that do not override it. This is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 same as @code{(default-value 'case-fold-search)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 @node Standard Regexps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 @section Standard Regular Expressions Used in Editing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 @cindex regexps used standardly in editing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 @cindex standard regexps used in editing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 This section describes some variables that hold regular expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 used for certain purposes in editing:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 @defvar page-delimiter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 This is the regexp describing line-beginnings that separate pages. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 default value is @code{"^\014"} (i.e., @code{"^^L"} or @code{"^\C-l"});
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 this matches a line that starts with a formfeed character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 The following two regular expressions should @emph{not} assume the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 match always starts at the beginning of a line; they should not use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 @samp{^} to anchor the match. Most often, the paragraph commands do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 check for a match only at the beginning of a line, which means that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 @samp{^} would be superfluous. When there is a nonzero left margin,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 they accept matches that start after the left margin. In that case, a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 @samp{^} would be incorrect. However, a @samp{^} is harmless in modes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 where a left margin is never used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 @defvar paragraph-separate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 This is the regular expression for recognizing the beginning of a line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 that separates paragraphs. (If you change this, you may have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 change @code{paragraph-start} also.) The default value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 @w{@code{"[@ \t\f]*$"}}, which matches a line that consists entirely of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 spaces, tabs, and form feeds (after its left margin).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 @defvar paragraph-start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 This is the regular expression for recognizing the beginning of a line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 that starts @emph{or} separates paragraphs. The default value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 @w{@code{"[@ \t\n\f]"}}, which matches a line starting with a space, tab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 newline, or form feed (after its left margin).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 @defvar sentence-end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 This is the regular expression describing the end of a sentence. (All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 paragraph boundaries also end sentences, regardless.) The default value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 is:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 "[.?!][]\"')@}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 This means a period, question mark or exclamation mark, followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 optionally by a closing parenthetical character, followed by tabs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 spaces or new lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 For a detailed explanation of this regular expression, see @ref{Regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 Example}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 @end defvar