-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathregular-expression.tex
More file actions
333 lines (282 loc) · 9.28 KB
/
regular-expression.tex
File metadata and controls
333 lines (282 loc) · 9.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
\section{Les expressions régulières}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Définition}
\begin{itemize}
\item une expression régulière est un "patron" (\textit{pattern})
décrivant une part d'une chaîne de caractères
\item une chaîne de caractères correspond au \textit{pattern} ou non
\item le \textit{pattern} peut être détecté n'importe où dans la
chaîne de caractères
\end{itemize}
\end{block}
\begin{exampleblock}{Patterns simples}
Le \textit{pattern} le plus simple est un caractère ou une suite
de caractères.
\end{exampleblock}
\begin{alertblock}{"Peu importe"}
Le point (.) permet être remplacé par n'importe quel caractère sauf
le \textit{newline}.
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Les ensembles}
\begin{itemize}
\item au lieu d'utiliser le point, il est possible de définir des
ensembles
\item deux possibilités :
\begin{itemize}
\item l'opérateur [] : l'un des caractères place entre crochet peut
apparaître (par exemple, \texttt{[abc]}) ; le symbole "-" permet
de simplifier les énumérations
\item des raccourcis : l'ensemble est défini par un \textbackslash et une
lettre, et désigne un ensemble prédéfini (par exemple, l'ensemble des
chiffres)
\end{itemize}
\end{itemize}
\end{block}
\begin{exampleblock}{Exemples}
\begin{lstlisting}{language=perl}
a[bcd]e # abe ou ace ou ade
a[b-y]z # abz ou ... ou ayz
a[\t ]b # a\tb ou a b
a[0-9] # a0 ou ... ou a9
\end{lstlisting}
\end{exampleblock}
\begin{alertblock}{Raccourcis}
\begin{lstlisting}{language=perl}
\d # idem a [0-9]
\w # idem a [a-zA-Z0-9_]
\s # idem a [\t\f\n\r ]
\end{lstlisting}
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Les "ancres" (\textit{anchors})}
Une ancre indique que l'on veut que le pattern soit accroché à un élément
spécifique :
\begin{itemize}
\item le début de la chaîne de caractères (\textasciicircum)
\item la fin de la chaîne (\$)
\item un mot (\textbackslash b)
\end{itemize}
\end{block}
\begin{exampleblock}{Exemples}
\begin{lstlisting}{language=perl}
^abc # 'abcde' est ok mais pas 'xyzabc'
xyz$ # 'abcxyz' est ok mais pas 'xyzabc'
Hello\b # 'Hello world' est ok mais pas 'Helloworld'
\end{lstlisting}
\end{exampleblock}
%$
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Les répétitions}
Il est possible de mentionner que certains \textit{patterns} se répétent.
Plusieurs fréquences possibles :
\begin{itemize}
\item ? : zéro ou une fois
\item * : zéro ou plusieurs fois
\item + : une ou plusieurs fois
\item \{\$n,\$m\} : de n à m fois
\item \{\$n,\} : au moins n fois
\item \{,\$m\} : au plus m fois
\end{itemize}
\end{block}
\begin{exampleblock}{Exemples}
\begin{lstlisting}{language=perl}
ab? # a ou ab
ab* # a ou ab ou abb ou ...
ab+ # ab ou abb ou ...
ab{2,3} # abb ou abbb
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Les alternatives}
\begin{itemize}
\item un \textit{pattern} peut se composer de plusieurs choix parmi
un ensemble
\item l'opérateur de séparation des alternatives est |
\item dans certains cas, l'utilisation des paranthèses est indispensable
pour gérer la priorité entre les opérateurs
\end{itemize}
\end{block}
\begin{exampleblock}{Exemples}
L'opérateur d'alternatives est moins prioritaires que \textasciicircum et
\$ :
\begin{lstlisting}{language=perl}
^a|b|c # identique a (^a)|b|c
a|b|c$ # identique a a|b|(c$)
^(a|b|c)
(a|b|c)$
\end{lstlisting}
\end{exampleblock}
%$
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{L'opérateur de correspondance (\textit{matching})}
\begin{itemize}
\item l'application d'un \textit{pattern} sur une chaîne de caractères
s'effectue à l'aide de m/REGEX/ où m signifie \textit{match} et REGEX est
le pattern
\item par défaut, la recherche de correspondance est réalisée sur la
variable par défaut \$\_
\item s'il y a correspondance alors \textit{true} est retournée
\item on peut chercher la correspondance sur une variable autre que \$\_ à
l'aide de l'opérateur de \textit{binding} : =\textasciitilde
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{exampleblock}{Exemples}
\begin{lstlisting}{language=perl}
if( m/REGEX/ )
{
print "It matches!\n";
}
if( $string =~ m/REGEX/ )
{
...
}
\end{lstlisting}
\end{exampleblock}
%$
\begin{alertblock}{Encore plus court !}
On peut omettre le m devant /REGEX/.
\begin{lstlisting}{language=perl}
if( /REGEX/ )
{
print "It matches!\n";
}
\end{lstlisting}
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{\textit{Case sensitive}}
\begin{itemize}
\item par défaut, l'opérateur de \textit{matching} recherche la
correspondance exacte
\item on peut lever le test majuscule / minuscule en ajoutant i à la fin
de l'opération de correspondance
\end{itemize}
\end{block}
\begin{exampleblock}{Exemples}
L'utilisateur peut faire o ou O.
\begin{lstlisting}{language=perl}
{
print "Voulez-vous supprimer le fichier ? ";
$answer = <STDIN>;
redo unless $answer =~ m/^o/i;
}
\end{lstlisting}
\end{exampleblock}
\begin{alertblock}{Le \textit{pattern} dans une variable}
Le \textit{pattern} peut être une chaîne de caractère.
\begin{lstlisting}{language=perl}
$regex = 'root|toto';
if( /$regex/ ) # identique a m/root|toto/
{ ... }
\end{lstlisting}
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Choix}
Les sous expressions paranthesées dans lequel il y a des alternatives ou
des patterns peuvent être récupérées, après l'opération de correspondance
\begin{lstlisting}{language=perl}
$_ = 'toto est un utilisateur';
m/(t\w+) est un utilisateur/;
$name = $1;
\end{lstlisting}
\$1 est une \textit{memory variable} et est égal à 'toto'
\end{block}
%$
\begin{alertblock}{Durée de vie des variables}
Les variables \$x issues des opérateurs de \textit{matching} ne sont pas
touchées jusqu'à la prochaine opération de \textit{matching}
\textbf{réussie}.
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Substitution}
\begin{itemize}
\item les expressions régulières sont aussi utilisées pour remplacer
une partie d'une chaîne de caractères par une autre chaîne
\item le \textit{pattern} permet de définir la partie de la chaîne
qui sera remplacé
\end{itemize}
\begin{lstlisting}{language=perl}
s/REGEX/REMPLACEMENT/
\end{lstlisting}
\end{block}
\begin{exampleblock}{Exemples}
\begin{lstlisting}{language=perl}
$_ = 'user: root';
s/user/utilisateur/; # $_ = 'utilisateur: root'
$name = 'user: toto';
$name =~ s/toto/titi/; # $name = 'user: titi'
\end{lstlisting}
\end{exampleblock}
%$
\begin{alertblock}{Retour d'une substitution}
Une substitution retourne \textit{true} si elle a eu lieue.
\end{alertblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{Changement de comportement}
On peut ajouter un modificateur de comportement :
\begin{itemize}
\item i : suppression du mode "case sensitive"
\item g : substitue toutes les occurrences du \textit{pattern}
\item s : change le comportement du point $\rightarrow$ les
\textit{newlines} sont pris en compte
\end{itemize}
\begin{lstlisting}{language=perl}
s/REGEX/REMPLACEMENT/
\end{lstlisting}
\end{block}
\begin{exampleblock}{Exemples}
\begin{lstlisting}{language=perl}
$_ = 'toto tata toto titi';
s/toto/titi/g; # $_ = 'titi tata titi titi';
$_ = 'toto tata Toto titi';
s/toto/titi/i; # $_ = 'titi tata titi titi';
s/\/\*.*\*\///s; # supprimer les commentaires d'un code source C
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]
\frametitle{Les expressions régulières}
\begin{block}{\textit{Memory variable}}
Lors de la substitution, les variables mémoires sont affectées et donc
réutilisable dans la chaîne de remplacement.
\begin{lstlisting}{language=perl}
$name = 'user: toto [tutu]';
$name =~ s/toto (\[tutu\]*)/$1 titi/;
\end{lstlisting}
\end{block}
%$
\begin{alertblock}{Autres délimiteurs}
\begin{itemize}
\item dans certains cas, les délimiteurs / / sont génants et nécessitent
l'utilisateur de \textbackslash
\item on peut les changer par \#...\# ou (...) ou <...> ou \{...\} ou [...]
\end{itemize}
\begin{lstlisting}{language=perl}
m/\/usr\/bin\/perl/
m#/usr/bin/perl#
s#/usr/bin/perl#/bin/perl#
\end{lstlisting}
\end{alertblock}
\end{frame}