Sign in Join
Wiki copytemporary

IDE regular expressions/pl: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<div style="font-size:1.88em;margin:0.75em 0;">
2-
31IDE wyrażeń regularnych
4-
5-</div>
62
73Pakiet RegExpr zawiera wiele implementacji wyrażeń regularnych
84
95## Regexpr wg Sorokina
106
117Jest to najbardziej kompletna implementacja dostępna w packages/regexpr/src/regexpr.pas
128
139Przeczytaj stronę wikipedii o wyrażeniach regularnych, aby zapoznać się z tym tematem: [Podstawowe wyrażenia regularne POSIX](https://pl.wikipedia.org/wiki/Wyra%C5%BCenie_regularne)
1410
1511Ten pakiet implementuje podzbiór wyrażeń regularnych Perla, a składnia dostarczona przez pakiet jest udokumentowana tutaj: <https://regex.sorokin.engineer/regex>
1612
1713### Zmiana wielkość liter w trakcie zastępowania
1814
1915Możesz zmienić wielkość liter w znalezionych fragmentach, użyć modyfikatorów w polu zamień na (zmiana wielkości liter działa po pozycji modyfikatora):
2016
2117- \l - Pierwszy znak na małą literę
2218- \L - Wszystkie znaki na małe litery
2319- \u - Pierwszy znak na wielką literę
2420- \U - Wszystkie znaki na wielkie litery
2521
2622Np. jeśli znaleziono słowo, to użyj wyrażenie zastępowania „\L\$0”, aby zmienić słowo na małe litery (tutaj 0\$ jest grupą 0 znalezionego tekstu).
2723
2824Ponadto \n zostanie zastąpiony znakiem końca wiersza (lub sekwencją znaków).
2925
3026### Prosty przykład użycia
3127
3228Użycie RegExpr Sorokina do sprawdzenia, czy wyrażenie jest obecne w ciągu jest bardzo łatwe, po prostu utwórz instancję TRegExpr, a następnie umieść swoje wyrażenie regularne we właściwości TRegExpr.Expression, a następnie użyj metody Exec, aby sprawdzić, czy są jakieś dopasowania dla tego regularnego wyrażenie. Exec zwróci wartość **true**, jeśli wyrażenie pasuje do przekazanego mu ciągu.
3329
3430``` pascal
3531var
3632 RegexObj: TRegExpr;
3733begin
3834 RegexObj := TRegExpr.Create;
3935 RegexObj.Expression := '.*zaloguj.*';
4036 if RegexObj.Exec('Proszę zaloguj się tutaj') then WriteLn('"zaloguj" został znaleziony!');
4137 RegexObj.Free;
4238end;
4339```
4440
4541Dopasowanie podwyrażenia:
4642
4743``` pascal
4844program Project1;
4945
5046uses
5147 RegExpr;
5248
5349var
5450 re: TRegExpr;
5551begin
5652 re := TRegExpr.Create('witaj (.*?)!');
5753 if re.Exec('witaj świecie! witaj pascal!') then
5854 begin
5955 WriteLn(re.Match[1]);
6056 while re.ExecNext do
6157 begin
6258 WriteLn(re.Match[1]);
6359 end;
6460 end;
6561 re.Free;
6662end.
6763```
6864
6965Wynik:
7066
7167 świecie
7268 pascal
7369
7470## FLRE - Wyrażenia regularne Fast Light wg BeRo1985
7571
7672FLRE (F ast L ight R egular E xpressions) jest szybką, bezpieczną i wydajną biblioteką wyrażeń regularnych, która jest zaimplementowana w Object Pascal (Delphi i Free Pascal), ale może być nawet używana z innych językach, takich jak C/C++ i tym podobnych. Obsługuje ciągi Unicode i UTF8.
7773
7874Implementuje wiele najpopularniejszych cech Perla i POSIX, z wyjątkiem funkcji wyrażeń nieregularnych, takich jak [referencje do przodu i zagnieżdżone referencje do tyłu](https://www.regular-expressions.info/backref2.html) i tak dalej, które nie są obsługiwane w FLRE, ale obsługiwane są tylko prawdziwe [referencje "wstecz"](https://www.regular-expressions.info/backref.html), stąd też słowo „Light” w nazwie FLRE. Znajduje również dopasowanie od lewej do pierwszej, to samo dopasowanie, które zrobiłby Perl i PCRE, i może zwrócić informacje o subdopasowaniu. Ale ma także flagę dla eksperymentalnego, jak do tej pory, najbardziej lewostronnego trybu zachowania w stylu POSIX.
7975
8076FLRE jest licencjonowany na licencji LGPL v2.1 z wyjątkiem statycznego linkowania.
8177
8278[repozytorium Github](https://github.com/BeRo1985/flre)
8379
8480### Przykład
8581
8682Implementacja funkcji PHP parse_url (oparta na [parse_url](http://locutus.io/php/url/parse_url/php.js))
8783
8884``` pascal
8985
9086uses Classes, SysUtils, flre;
9187
9288type
9389
9490 RUrlParser = record
9591private
9692 Fcomponents : array[1..13] of string;
9793
9894private
9995 function getComponent( aIndex : integer ) : string;
10096 procedure setComponent( aIndex : integer; const aValue : string );
10197
10298public
10399 function parse( const aUrl : UTF8String ) : boolean;
104100
105101public
106102 property scheme : string index 1 read getComponent write setComponent; // e.g. http
107103 property authority : string index 2 read getComponent;
108104 property userInfo : string index 3 read getComponent;
109105 property user : string index 4 read getComponent;
110106 property pass : string index 5 read getComponent;
111107 property host : string index 6 read getComponent;
112108 property port : string index 7 read getComponent;
113109 property path : string index 9 read getComponent;
114110 property directory : string index 10 read getComponent;
115111 property fileName : string index 11 read getComponent;
116112 property query : string index 12 read getComponent; // after the question mark ?
117113 property fragment : string index 13 read getComponent; // after the hashmark #
118114
119115 end;
120116
121117implementation
122118
123119function RUrlParser.getComponent( aIndex : integer ) : string;
124120begin
125121 Result := Fcomponents[ aIndex ];
126122end;
127123
128124procedure RUrlParser.setComponent( aIndex : integer; const aValue : string );
129125begin
130126 Fcomponents[ aIndex ] := aValue;
131127end;
132128
133129function RUrlParser.parse( const aUrl : UTF8String ) : boolean; overload;
134130var
135131 i : integer;
136132 re : TFLRE;
137133 parts : TFLREMultiStrings;
138134begin
139135 re := TFLRE.Create( '(?:([^:\\/\?#]+):)?'
140136 + '(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?'
141137 + '()'
142138 + '(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)'
143139 , [ rfUTF8 ]
144140 );
145141
146142 parts := nil;
147143 Result := re.UTF8ExtractAll( aUrl, parts );
148144 if ( Result ) then
149145 begin
150146 for i := 1 to Length( parts[0] ) - 1 do
151147 begin
152148 setComponent( i, string( parts[0][i] ) );
153149 end;
154150 end;
155151
156152 // Free regexp memory
157153 for i := 0 to Length( parts ) - 1 do
158154 begin
159155 SetLength( parts[i], 0 );
160156 end;
161157 parts := nil;
162158
163159 re.Free();
164160end;
165161```
166162
167163## Regexpr wg Joosta
168164
169165Regexpr stworzony przez Joosta (moduły oldregexpr.pp i regex.pp) jest bardzo podstawowym modułem wyrażeń regularnych, obsługuje większość wyrażeń regularnych takich jak GNU regexpr. Używa regex do wyszukiwania wzorców wewnątrz łańcucha znaków.
170166
171167Obecny moduł jest daleki do ukończenia i nadal brakuje mu bardzo prostej obsługi składni [POSIX](http://www.opengroup.org/onlinepubs/007908799/xbd/re.html) lub bardziej złożonej składni, takiej jak w [Perl regex](http://www.pcre.org/), [Java Regex](http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html), [Ruby Regex](http://www.jpsoft.com/help/index.htm?regularexpressionsyntax.htm) itp ...
172168
173169Obecnie moduł zawiera 4 funkcje:
174170
175171- GenerateRegExprEngine – Ta funkcja kompiluje wzorzec wyrażenia regularnego.
176172- RegExprPos – Znajduje wzorzec w danym ciągu.
177173- DestroyRegExprEngine – Uwalnia kompilację wzorca
178174- RegExprEscapeStr – Odwołuje się do rezerwowej składni języka wyrażeń regularnych, więc będzie rozumiana jako ciąg znaków zamiast składni regex.
179175
180176Jest też jeden test:
181177
182178- **testreg1** program testowy demonstrujący obsługiwane wyrażenia regularne.
183179
184180## Regexpr wg Floriana
185181
186182To jest najstarsze wdrożenie. Jest obecny w packages/regexpr/src/old i nie jest aktualnie kompilowany przez pliki makefiles, więc nie jest dostępny domyślnie w prekompilowanych wersjach wydań FPC/Lazarus.
187183
188184## Zobacz także
189185
190186- [Porównanie silników wyrażeń regularnych (en)](http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines)
191187
192188Wróć do [[Package List|Packages List]]
193189
194190---
195191*From the Free Pascal wiki, page "IDE regular expressions/pl", as it stood on 2022-02-05 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
196192Category: Packages

Back to history