annotate man/lispref/searching.texi @ 778:2923009caf47

[xemacs-hg @ 2002-03-16 10:38:59 by ben] cm.c, file-coding.c: fix warnings. .cvsignore: Those pesky *.tmp files. mule\arabic.el, mule\canna-leim.el, mule\china-util.el, mule\chinese.el, mule\cyril-util.el, mule\cyrillic.el, mule\devan-util.el, mule\devanagari.el, mule\english.el, mule\ethio-util.el, mule\ethiopic.el, mule\european.el, mule\greek.el, mule\hebrew.el, mule\indian.el, mule\japan-util.el, mule\japanese.el, mule\korea-util.el, mule\korean.el, mule\lao-util.el, mule\lao.el, mule\misc-lang.el, mule\mule-charset.el, mule\mule-cmds.el, mule\thai-util.el, mule\thai.el, mule\tibet-util.el, mule\tibetan.el, mule\viet-util.el, mule\vietnamese.el, unicode.el: Fix lots of warnings. Sync up some files to FSF 21.1. Copy over all charset definitions from FSF 21.1, convert them to our format, and stick them in the relevant files. Eventually we will actually be able to dump these files (though they may not quite work). autoload.el: Support defun*, defmacro*. mule/mule-composite.el, mule/mule-composite-stub.el: New file, stubs for nonexistent composition funs/vars. mule/viet-chars.el, dumped-lisp.el: Account for these changes. font.el, mouse.el, msw-font-menu.el, printer.el, startup.el: fix warnings.
author ben
date Sat, 16 Mar 2002 10:39:19 +0000
parents 1ccc32a20af4
children 0f42689481f0
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 In other words, after the end of a @samp{\( @dots{} \)} construct. the
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
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
476 the groupings at the end.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 Using @samp{\(?: @dots{} \)} rather than @samp{\( @dots{} \)} when you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 don't need the captured substrings ought to speed up your programs some,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 since it shortens the code path followed by the regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 engine, as well as the amount of memory allocation and string copying it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 must do. The actual performance gain to be observed has not been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 measured or quantified as of this writing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 @c This is used to good advantage by the font-locking code, and by
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
485 @c `regexp-opt.el'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 The shy grouping operator has been borrowed from Perl, and has not been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 available prior to XEmacs 20.3, nor is it available in FSF Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 @item \w
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 @cindex @samp{\w} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 matches any word-constituent character. The editor syntax table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 determines which characters these are. @xref{Syntax Tables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 @item \W
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 @cindex @samp{\W} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 matches any character that is not a word constituent.
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 \s@var{code}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 @cindex @samp{\s} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 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
502 character that represents a syntax code: thus, @samp{w} for word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 constituent, @samp{-} for whitespace, @samp{(} for open parenthesis,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 etc. @xref{Syntax Tables}, for a list of syntax codes and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 characters that stand for them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 @item \S@var{code}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 @cindex @samp{\S} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 matches any character whose syntax is not @var{code}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 The following regular expression constructs match the empty string---that is,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 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
514 context.
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 @table @kbd
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 @item \`
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 @cindex @samp{\`} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 matches the empty string, but only at the beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 of the buffer or string being matched against.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 @item \'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 @cindex @samp{\'} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 matches the empty string, but only at the end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 the buffer or string being matched against.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 @item \=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 @cindex @samp{\=} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 matches the empty string, but only at point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (This construct is not defined when matching against a string.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 @item \b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 @cindex @samp{\b} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 matches the empty string, but only at the beginning or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 end of a word. Thus, @samp{\bfoo\b} matches any occurrence of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 @samp{foo} as a separate word. @samp{\bballs?\b} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 @samp{ball} or @samp{balls} as a separate word.@refill
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 @item \B
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 @cindex @samp{\B} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 matches the empty string, but @emph{not} at the beginning or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 end of a word.
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 beginning of a word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 @item \>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 @cindex @samp{\>} in regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 matches the empty string, but only at the end of a word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 @kindex invalid-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 Not every string is a valid regular expression. For example, a string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 with unbalanced square brackets is invalid (with a few exceptions, such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 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
557 an invalid regular expression is passed to any of the search functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 an @code{invalid-regexp} error is signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 @defun regexp-quote string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 This function returns a regular expression string that matches exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 @var{string} and nothing else. This allows you to request an exact
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 string match when calling a function that wants a regular expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (regexp-quote "^The cat$")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 @result{} "\\^The cat\\$"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 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
573 context described as a regular expression. For example, this searches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 for the string that is the value of @code{string}, surrounded by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 whitespace:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (re-search-forward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (concat "\\s-" (regexp-quote string) "\\s-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 @node Regexp Example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 @subsection Complex Regexp Example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 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
589 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
590 the variable @code{sentence-end}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 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
593 spaces from tab characters. The string constant begins and ends with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 double-quote. @samp{\"} stands for a double-quote as part of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 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
596 tab and @samp{\n} for a newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 "[.?!][]\"')@}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 In contrast, if you evaluate the variable @code{sentence-end}, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 will see the following:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 sentence-end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 @result{}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
609 "[.?!][]\"')@}]*\\($\\| $\\| \\| \\)[
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 ]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 @end example
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 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 In this output, tab and newline appear as themselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 This regular expression contains four parts in succession and can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 deciphered as follows:
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 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 @item [.?!]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 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
623 three characters: period, question mark, and exclamation mark. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 match must begin with one of these three characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 @item []\"')@}]*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 The second part of the pattern matches any closing braces and quotation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 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
629 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
630 a string. The @samp{*} at the end indicates that the immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 preceding regular expression (a character set, in this case) may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 repeated zero or more times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 @item \\($\\|@ $\\|\t\\|@ @ \\)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 The third part of the pattern matches the whitespace that follows the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 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
637 double backslashes mark the parentheses and vertical bars as regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 expression syntax; the parentheses delimit a group and the vertical bars
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 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
640 line.
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 @item [ \t\n]*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 Finally, the last part of the pattern matches any additional whitespace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 beyond the minimum needed to end a sentence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 @node Regexp Search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 @section Regular Expression Searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 @cindex regular expression searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 @cindex regexp searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 @cindex searching for regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 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
654 incrementally or not. Incremental search commands are described in the
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
655 @cite{The XEmacs Lisp Reference Manual}. @xref{Regexp Search, , Regular Expression
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
656 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
657 functions useful in programs. The principal one is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 @code{re-search-forward}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
660 @deffn Command re-search-forward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 This function searches forward in the current buffer for a string of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 text that is matched by the regular expression @var{regexp}. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 function skips over any amount of text that is not matched by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 @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
665 It returns the new value of point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 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
668 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
669 after that position is accepted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 What happens when the search fails depends on the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 @var{noerror}. If @var{noerror} is @code{nil}, a @code{search-failed}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 error is signaled. If @var{noerror} is @code{t},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 @code{re-search-forward} does nothing and returns @code{nil}. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 @var{noerror} is neither @code{nil} nor @code{t}, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 @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
677 buffer) and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
679 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
680 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
681 previous time's match). If these successive searches succeed, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 function succeeds, moving point and returning its new value. Otherwise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 the search fails.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 In the following example, point is initially before the @samp{T}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 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
687 the @samp{t} of @samp{hat} and the newline).
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 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 I read "@point{}The cat in the hat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 (re-search-forward "[a-z]+" nil t 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 @result{} 27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 I read "The cat in the hat@point{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
709 @deffn Command re-search-backward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 This function searches backward in the current buffer for a string of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 text that is matched by the regular expression @var{regexp}, leaving
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 point at the beginning of the first text found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 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
715 simple mirror images. @code{re-search-forward} finds the match whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 beginning is as close as possible to the starting point. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 @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
718 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
719 match whose beginning is as close as possible. The reason is that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 matching a regular expression at a given spot always works from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 beginning to end, and starts at a specified beginning position.
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 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
724 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
725 trouble of implementing that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
728 @defun string-match regexp string &optional start buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 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
730 the regular expression @var{regexp} in @var{string}, or @code{nil} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 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
732 at that index in @var{string}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
734
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
735 Optional arg @var{buffer} controls how case folding is done (according
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
736 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
737 @var{buffer}'s case tables) and defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
738
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 "quick" "The quick brown fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 "quick" "The quick brown fox jumped quickly." 8)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 @result{} 27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 The index of the first character of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 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
757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 After this function returns, the index of the first character beyond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 the match is available as @code{(match-end 0)}. @xref{Match Data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 "quick" "The quick brown fox jumped quickly." 8)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 @result{} 27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 (match-end 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 @result{} 32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 @defun split-string string &optional pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 This function splits @var{string} to substrings delimited by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @var{pattern}, and returns a list of substrings. If @var{pattern} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 omitted, it defaults to @samp{[ \f\t\n\r\v]+}, which means that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 splits @var{string} by white--space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 (split-string "foo bar")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 @result{} ("foo" "bar")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 (split-string "something")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 @result{} ("something")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 (split-string "a:b:c" ":")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 @result{} ("a" "b" "c")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 (split-string ":a::b:c" ":")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 @result{} ("" "a" "" "b" "c")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 @defun split-path path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 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
806 components are separated with the characters specified with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 @code{path-separator}. Under Unix, @code{path-separator} will normally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 be @samp{:}, while under Windows, it will be @samp{;}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
811 @defun looking-at regexp &optional buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 This function determines whether the text in the current buffer directly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 following point matches the regular expression @var{regexp}. ``Directly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 following'' means precisely that: the search is ``anchored'' and it can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 succeed only starting with the first character following point. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 result is @code{t} if so, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 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
819 you can access using @code{match-beginning} and @code{match-end}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 @xref{Match Data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 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
823 were anywhere else, the result would be @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 I read "@point{}The cat in the hat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 (looking-at "The cat in the hat$")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 @node POSIX Regexps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 @section POSIX Regular Expression Searching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 The usual regular expression functions do backtracking when necessary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 to handle the @samp{\|} and repetition constructs, but they continue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 this only until they find @emph{some} match. Then they succeed and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 report the first match found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 This section describes alternative search functions which perform the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 full backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 matching. They continue backtracking until they have tried all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 possibilities and found all matches, so they can report the longest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 match, as required by POSIX. This is much slower, so use these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 functions only when you really need the longest match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 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
854 the functions described above implemented full POSIX backtracking.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
856 @deffn Command posix-search-forward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 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
858 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 matching.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
860 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
862 @deffn Command posix-search-backward regexp &optional limit noerror count buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 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
864 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 matching.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
866 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
868 @defun posix-looking-at regexp &optional buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 This is like @code{looking-at} except that it performs the full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 matching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
874 @defun posix-string-match regexp string &optional start buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 This is like @code{string-match} except that it performs the full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 backtracking specified by the POSIX standard for regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 matching.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
878
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
879 Optional arg @var{buffer} controls how case folding is done (according
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
880 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
881 @var{buffer}'s case tables) and defaults to the current buffer.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 @end defun
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 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 @deffn Command delete-matching-lines regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 This function is identical to @code{delete-non-matching-lines}, save
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 that it deletes what @code{delete-non-matching-lines} keeps.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 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
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 We hold these truths
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 to be self-evident,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 that all men are created
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 equal, and that they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 (delete-matching-lines "the")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 to be self-evident,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 that all men are created
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 @deffn Command flush-lines regexp
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
914 This function is an alias of @code{delete-matching-lines}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
917 @deffn Command delete-non-matching-lines regexp
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 This function deletes all lines following point which don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 contain a match for the regular expression @var{regexp}.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
920 @end deffn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 @deffn Command keep-lines regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 This function is the same as @code{delete-non-matching-lines}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
926 @deffn Command count-matches regexp
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 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
928 the current buffer following point. It prints this number in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 the echo area, returning the string printed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
932 @deffn Command how-many regexp
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
933 This function is an alias of @code{count-matches}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
936 @deffn Command list-matching-lines regexp &optional nlines
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 This function is a synonym of @code{occur}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 Show all lines following point containing a match for @var{regexp}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 Display each line with @var{nlines} lines before and after,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 or @code{-}@var{nlines} before if @var{nlines} is negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 @var{nlines} defaults to @code{list-matching-lines-default-context-lines}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 Interactively it is the prefix arg.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 The lines are shown in a buffer named @samp{*Occur*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 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
946 @kbd{C-h m} (@code{describe-mode} in that buffer gives help.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 @defopt list-matching-lines-default-context-lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 Default value is 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 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
952 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
953 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
954 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 @end ignore
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 @node Search and Replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 @section Search and Replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 @cindex replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 @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
962 This function is the guts of @code{query-replace} and related commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 It searches for occurrences of @var{from-string} and replaces some or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 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
965 occurrences; otherwise, it asks the user what to do about each one.
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 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
968 considered a regular expression; otherwise, it must match literally. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 @var{delimited-flag} is non-@code{nil}, then only replacements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 surrounded by word boundaries are considered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 The argument @var{replacements} specifies what to replace occurrences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 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
974 strings, to be used in cyclic order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 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
977 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
978 @var{replacements} list before advancing cyclicly to the next one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 Normally, the keymap @code{query-replace-map} defines the possible user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 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
982 keymap to use instead of @code{query-replace-map}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 @defvar query-replace-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 This variable holds a special keymap that defines the valid user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 responses for @code{query-replace} and related functions, as well as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 @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
989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 The ``key bindings'' are not commands, just symbols that are meaningful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 to the functions that use this map.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 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
997 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
998 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
999 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 Here are the meaningful ``bindings'' for @code{query-replace-map}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 Several of them are meaningful only for @code{query-replace} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 friends.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 @item act
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 Do take the action being considered---in other words, ``yes.''
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 @item skip
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 Do not take action for this question---in other words, ``no.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 @item exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 Answer this question ``no,'' and give up on the entire series of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 questions, assuming that the answers will be ``no.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 @item act-and-exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 Answer this question ``yes,'' and give up on the entire series of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 questions, assuming that subsequent answers will be ``no.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 @item act-and-show
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 Answer this question ``yes,'' but show the results---don't advance yet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 to the next question.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 @item automatic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 Answer this question and all subsequent questions in the series with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 ``yes,'' without further user interaction.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 @item backup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 Move back to the previous place that a question was asked about.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 @item edit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 Enter a recursive edit to deal with this question---instead of any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 other action that would normally be taken.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 @item delete-and-edit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 Delete the text being considered, then enter a recursive edit to replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 @item recenter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 Redisplay and center the window, then ask the same question again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 @item quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 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
1045 use this answer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 @item help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 Display some help, then ask again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 @end table
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 @node Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 @section The Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 @cindex match data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 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
1056 text found during a regular expression search. This means, for example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 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
1058 message, and then extract parts of the match under control of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 pattern.
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 Because the match data normally describe the most recent search only,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 you must be careful not to do another search inadvertently between the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 search you wish to refer back to and the use of the match data. If you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 can't avoid another intervening search, you must save and restore the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 match data around it, to prevent it from being overwritten.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 * Simple Match Data:: Accessing single items of match data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 such as where a particular subexpression started.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 * Replacing Match:: Replacing a substring that was matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 * 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
1072 * Saving Match Data:: Saving and restoring the match data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 @node Simple Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 @subsection Simple Match Data Access
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 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
1079 matched by the last search or match operation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 You can ask about the entire matching text, or about a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 parenthetical subexpression of a regular expression. The @var{count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 argument in the functions below specifies which. If @var{count} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 zero, you are asking about the entire match. If @var{count} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 positive, it specifies which subexpression you want.
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 Recall that the subexpressions of a regular expression are those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 expressions grouped with escaped parentheses, @samp{\(@dots{}\)}. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 @var{count}th subexpression is found by counting occurrences of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 @samp{\(} from the beginning of the whole regular expression. The first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 subexpression is numbered 1, the second 2, and so on. Only regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 expressions can have subexpressions---after a simple string search, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 only information available is about the entire match.
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 @defun match-string count &optional in-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 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
1097 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
1098 or just the portion corresponding to the @var{count}th parenthetical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 subexpression, if @var{count} is positive. If @var{count} is out of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 range, or if that subexpression didn't match anything, the value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 If the last such operation was done against a string with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 @code{string-match}, then you should pass the same string as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 argument @var{in-string}. Otherwise, after a buffer search or match,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 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
1107 should make sure that the current buffer when you call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 @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
1109 matching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 @defun match-beginning count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 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
1114 last regular expression searched for, or a subexpression of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 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
1117 the entire match. Otherwise, @var{count} specifies a subexpression in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 the regular expression, and the value of the function is the starting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 position of the match for that subexpression.
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 The value is @code{nil} for a subexpression inside a @samp{\|}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 alternative that wasn't used in the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 @defun match-end count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 This function is like @code{match-beginning} except that it returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 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
1128 beginning.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 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
1132 positions within the text:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 (string-match "\\(qu\\)\\(ick\\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 "The quick fox jumped quickly.")
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1138 ;0123456789
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 (match-string 0 "The quick fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 @result{} "quick"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 (match-string 1 "The quick fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 @result{} "qu"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 (match-string 2 "The quick fox jumped quickly.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 @result{} "ick"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 (match-beginning 1) ; @r{The beginning of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 @result{} 4 ; @r{with @samp{qu} is at index 4.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 (match-beginning 2) ; @r{The beginning of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 @result{} 6 ; @r{with @samp{ick} is at index 6.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 @end group
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 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 (match-end 1) ; @r{The end of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 @result{} 6 ; @r{with @samp{qu} is at index 6.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 (match-end 2) ; @r{The end of the match}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 @result{} 9 ; @r{with @samp{ick} is at index 9.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 Here is another example. Point is initially located at the beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 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
1172 @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
1173 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
1174 subexpression is at the 13th character (@samp{c}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 (re-search-forward "The \\(cat \\)")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 (match-beginning 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 (match-beginning 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 @result{} (9 9 13)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 I read "The cat @point{}in the hat comes back" twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 ^ ^
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 9 13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 ---------- Buffer: foo ----------
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 (In this case, the index returned is a buffer position; the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 character of the buffer counts as 1.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 @node Replacing Match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 @subsection Replacing the Text That Matched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 This function replaces the text matched by the last search with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 @var{replacement}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 @cindex case in replacements
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1205 @defun replace-match replacement &optional fixedcase literal string strbuffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 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
1207 was matched by the last search. It replaces that text with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 @var{replacement}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 If you did the last search in a buffer, you should specify @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 for @var{string}. Then @code{replace-match} does the replacement by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 editing the buffer; it leaves point at the end of the replacement text,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 and returns @code{t}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 If you did the search in a string, pass the same string as @var{string}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 Then @code{replace-match} does the replacement by constructing and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 returning a new string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1219 If the fourth argument @var{string} is a string, fifth argument
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1220 @var{strbuffer} specifies the buffer to be used for syntax-table and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1221 case-table lookup and defaults to the current buffer. When @var{string}
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1222 is not a string, the buffer that the match occurred in has automatically
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1223 been remembered and you do not need to specify it.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1224
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 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
1226 text is not changed; otherwise, the replacement text is converted to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 different case depending upon the capitalization of the text to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 replaced. If the original text is all upper case, the replacement text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 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
1230 capitalized, then the first word of the replacement text is capitalized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 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
1232 letter, @code{replace-match} considers this a capitalized first word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 rather than all upper case.
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 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
1236 regardless of the value of @var{fixedcase}. @xref{Searching and Case}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 If @var{literal} is non-@code{nil}, then @var{replacement} is inserted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 exactly as it is, the only alterations being case changes as needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 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
1241 specially. If a @samp{\} appears in @var{replacement}, then it must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 part of one of the following sequences:
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 @table @asis
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 @item @samp{\&}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 @cindex @samp{&} in replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 @samp{\&} stands for the entire text being replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 @item @samp{\@var{n}}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 @cindex @samp{\@var{n}} in replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 @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
1252 matched the @var{n}th subexpression in the original regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 Subexpressions are those expressions grouped inside @samp{\(@dots{}\)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 @item @samp{\\}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 @cindex @samp{\} in replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 @samp{\\} stands for a single @samp{\} in the replacement text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 @node Entire Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 @subsection Accessing the Entire Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 The functions @code{match-data} and @code{set-match-data} read or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 write the entire match data, all at once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1267 @defun match-data &optional integers reuse
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 This function returns a newly constructed list containing all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 information on what text the last search matched. Element zero is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 position of the beginning of the match for the whole expression; element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 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
1272 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
1273 match for the first subexpression, and so on. In general, element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 number 2@var{n}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 @tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 number {\mathsurround=0pt $2n$}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 @end tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 corresponds to @code{(match-beginning @var{n})}; and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 number 2@var{n} + 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 @tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 number {\mathsurround=0pt $2n+1$}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 @end tex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 corresponds to @code{(match-end @var{n})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 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
1291 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
1292 string with @code{string-match}. However, if the optional first
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1293 argument @var{integers} is non-@code{nil}, always use integers (rather
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1294 than markers) to represent buffer positions.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1295
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1296 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
1297 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
1298 @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
1299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 As always, there must be no possibility of intervening searches between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 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
1302 intended to access the match data for that search.
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 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 (match-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 @result{} (#<marker at 9 in foo>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 #<marker at 17 in foo>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 #<marker at 13 in foo>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 #<marker at 17 in foo>)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 @defun set-match-data match-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 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
1317 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
1318 @code{match-data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 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
1321 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
1322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 @findex store-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 @code{store-match-data} is an alias for @code{set-match-data}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 @node Saving Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 @subsection Saving and Restoring the Match Data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 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
1331 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
1332 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
1333 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
1334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 (re-search-forward "The \\(cat \\)")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 @result{} 48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 (foo) ; @r{Perhaps @code{foo} does}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 ; @r{more searching.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 (match-end 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 @result{} 61 ; @r{Unexpected result---not 48!}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 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
1347
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1348 @defspec save-match-data body@dots{}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 This special form executes @var{body}, saving and restoring the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 data around it.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1351 @end defspec
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 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
1354 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
1355 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
1356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 (let ((data (match-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 @dots{} ; @r{May change the original match data.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 (set-match-data data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 Emacs automatically saves and restores the match data when it runs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 process filter functions (@pxref{Filter Functions}) and process
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 sentinels (@pxref{Sentinels}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 Here is a function which restores the match data provided the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 associated with it still exists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 (defun restore-match-data (data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 @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
1378 @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
1379 "Restore the match data DATA unless the buffer is missing."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 (catch 'foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 (let ((d data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 (while d
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 (and (car d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 (null (marker-buffer (car d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 ;; @file{match-data} @r{buffer is deleted.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 (throw 'foo nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 (setq d (cdr d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 (set-match-data data))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 @node Searching and Case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 @section Searching and Case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 @cindex searching and case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 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
1400 searching through; if you specify searching for @samp{FOO}, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 @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
1402 particular character sets, are included: thus, @samp{[aB]} would match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 @samp{a} or @samp{A} or @samp{b} or @samp{B}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 If you do not want this feature, set the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 @code{case-fold-search} to @code{nil}. Then all letters must match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 exactly, including case. This is a buffer-local variable; altering the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 variable affects only the current buffer. (@xref{Intro to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 Buffer-Local}.) Alternatively, you may change the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 @code{default-case-fold-search}, which is the default value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 @code{case-fold-search} for buffers that do not override it.
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 Note that the user-level incremental search feature handles case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 distinctions differently. When given a lower case letter, it looks for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 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
1416 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
1417 searching functions Lisp functions use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 @defopt case-replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 This variable determines whether the replacement functions should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 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
1422 replacement text verbatim. A non-@code{nil} value means to convert the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 case of the replacement text according to the text being replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 The function @code{replace-match} is where this variable actually has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 its effect. @xref{Replacing Match}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 @defopt case-fold-search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 This buffer-local variable determines whether searches should ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 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
1432 they do ignore case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 @defvar default-case-fold-search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 The value of this variable is the default value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 @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
1438 same as @code{(default-value 'case-fold-search)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 @node Standard Regexps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 @section Standard Regular Expressions Used in Editing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 @cindex regexps used standardly in editing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 @cindex standard regexps used in editing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 This section describes some variables that hold regular expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 used for certain purposes in editing:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 @defvar page-delimiter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 This is the regexp describing line-beginnings that separate pages. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 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
1452 this matches a line that starts with a formfeed character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 The following two regular expressions should @emph{not} assume the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 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
1457 @samp{^} to anchor the match. Most often, the paragraph commands do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 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
1459 @samp{^} would be superfluous. When there is a nonzero left margin,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 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
1461 @samp{^} would be incorrect. However, a @samp{^} is harmless in modes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 where a left margin is never used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 @defvar paragraph-separate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 This is the regular expression for recognizing the beginning of a line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 that separates paragraphs. (If you change this, you may have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 change @code{paragraph-start} also.) The default value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 @w{@code{"[@ \t\f]*$"}}, which matches a line that consists entirely of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 spaces, tabs, and form feeds (after its left margin).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 @defvar paragraph-start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 This is the regular expression for recognizing the beginning of a line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 that starts @emph{or} separates paragraphs. The default value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 @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
1476 newline, or form feed (after its left margin).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 @end defvar
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 @defvar sentence-end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 This is the regular expression describing the end of a sentence. (All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 paragraph boundaries also end sentences, regardless.) The default value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 is:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 "[.?!][]\"')@}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 This means a period, question mark or exclamation mark, followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 optionally by a closing parenthetical character, followed by tabs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 spaces or new lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 For a detailed explanation of this regular expression, see @ref{Regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 Example}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 @end defvar