Bulgarian
EnglishFrench German Russian Spanish |
| Предназначение | Инсталиране | Синтаксис | Интерфейс | ЧЕВО | Демо | Автор |
|
Èíòåðôåéñ íà TRegExpr
Ïóáëè÷íè ìåòîäè è ñâîéñòâà íà TRegExpr: property Expression : string Ïðåäñòàâëÿâà ñàìèÿò RE. Ñ öåë îïòèìèçàöèÿ, ïðèñâîÿâàòå RE íà òîâà ñâîéñòâî, TRegExpr àâòîìàòè÷íî ãî êîìïèëèðà â 'Ð-êîä' (Ìîæå äà ãî âèäèòå ñ ïîìîùòà íà ìåòîäà Dump) è ãî çàïèñâà âúâ âúòðåøíèòå ñè ñòðóêòóðè. Èñòèíñêî [ðå]êîìïèëèðàíå ñå ïðàâè ñàìî êîãàòî âúçíèêíå íóæäà îò òîâà ïðè èçâèêâàíå íà Exec[Next], Substitute, Dump è ò.í. è ñàìî àêî ñàìèÿò èçðàç èëè äðóãî ñâîéñòâî, âëèÿåùè âúðõó Ð-êîäà áúäàò ïðîìåíåíè ñëåä ïîñëåäíàòà [ðå]êîìïèëàöèÿ.  ñëó÷àé íà ãðåøêà ïðè [ðå]êîìïèëèðàíå, ñå èçâèêâà ìåòîäúò Error (ïî ïîäðàçáèðàíå ìåòîäúò Error ïðåäèçâèêâà èçêëþ÷åíèå âèæ ïî-äîëó) property ModifierStr : string Çà ïðîâåðêà/óñòàíîâÿâàíå íà ñòîéíîñòèòå íà ìîäèôèêàòîðèòå íà RE. Ôîðìàòúò íà ñòðèíãà å ïîäîáåí íà òîçè ïðè ìîäèôèêàòîðèòå (?ismx-ismx). Íàïðèìåð, ModifierStr := 'i-x' ùå âêëþ÷è ìîäèôèêàòîðà /i, ùå èçêëþ÷è /x è íÿìà äà ïðîìåíè îñòàíàëèòå. Àêî ñå îïèòàòå äà çàäàäåòå íåïîçíàò ìîäèôèêàòîð, ùå ñå èçâèêà ìåòîäúò Error (ïî ïîäðàçáèðàíå ìåòîäúò Error ïðåäèçâèêâà èçêëþ÷åíèå ERegExpr). property ModifierI : boolean Ìîäèôèêàòîð /i ïðîâåðêà áåç îò÷èòàíå ãëàâíè/ìàëêè áóêâè. Ïðèåìà íà÷àëíà ñòîéíîñò îò RegExprModifierI. property ModifierR : boolean Ìîäèôèêàòîð /r èçïîëçâàíå íà äèàïàçîíè çà ðóñêè åçèê. Ïðèåìà íà÷àëíà ñòîéíîñò îò RegExprModifierR. property ModifierS : boolean Ìîäèôèêàòîð /s - '.' ñúâïàäà ñ âñåêè ñèìâîë (èíà÷å íå ñúâïàäà ñ LineSeparators è LinePairedSeparator). Ïðèåìà íà÷àëíà ñòîéíîñò îò RegExprModifierS. property ModifierG : boolean; Ìîäèôèêàòîð /g - èçêëþ÷âàíåòî íà /g ïðåâêëþ÷âà âñè÷êè îïåðàöèè â "íåæàäåí" ñòèë òàêà, ÷å àêî ModifierG = False, òî âñè÷êè '*' ðàáîòÿò êàòî '*?', âñè÷êè '+' êàòî '+?' è ò.í. Ïðèåìà íà÷àëíà ñòîéíîñò îò RegExprModifierG. property ModifierM : boolean; Ìîäèôèêàòîð /m - òðåòèðà ñòðèíãà êàòî ñúñòàâåí îò ìíîãî ðåäîâå. Ò.å. çàäàâà çà `^' è `$' âìåñòî äà ñúâïàäàò ñúñ ñàìîòî íà÷àëî èëè êðàé íà ñòðèíãà, äà ñúâïàäàò ñ íà÷àëîòî è êðàÿ íà âñÿêè ðåä âúòðå â ñàìèÿ ñòðèíã. Ïðèåìà íà÷àëíà ñòîéíîñò îò RegExprModifierM. property ModifierX : boolean; Ìîäèôèêàòîð /x eXtended ñèíòàêñèñ. Ïðèåìà íà÷àëíà ñòîéíîñò îò RegExprModifierX. function Exec (const AInputString : string) : boolean; Ïðîâåðêà çà ñúâïàäåíèå íà RE ñ âõîäíèÿ ñòðèíã AInputString !!! Exec çàïàçâà AInputString â ñâîéñòâîòî InputString function ExecNext : boolean; òúðñè çà ñëåäâàùî ñúâïàäåíèå: Exec (AString); ExecNext; ðàáîòè ïî ñúùèÿ íà÷èí, êàêòî Exec (AString); if MatchLen [0] = 0 then ExecPos (MatchPos [0] + 1) else ExecPos (MatchPos [0] + MatchLen [0]); íî å äîñòà ïî-ïðîñòî çà ðàçáèðàíå ! function ExecPos (AOffset: integer = 1) : boolean; Òúðñè çà ñúâïàäåíèå íà RE ñ âõîäíèÿ ñòðèíã, çàïî÷âàéêè îò ïîçèöèÿ AOffset (AOffset=1 ïúðâèÿò ñèìâîë íà InputString) property InputString : string; òåêóùèÿò âõîäåí ñòðèíã (ïðèñâîåí ÿâíî èëè îò ïîñëåäíèÿ Exec). ñÿêî ïðèñâîÿâàíå íà ñòðèíã íà òîâà ñâîéñòâî èçòðèâà ñòîéíîñòèòå íà ñâîéñòâàòà Match* ! function Substitute (const ATemplate : string) : string; Âðúùà ñòðèíãà Atemplate, â êîéòî '$&' èëè '$0' å çàìåíåíî ñ öåëèÿ RE, à '$n' ñå çàìåíÿ ñ ïîäèçðàçà ñ íîìåð n. Ñëåä âåðñèÿ v.0.929 ñå èçïîëçâà '$' âìåñòî '\' (çà áúäåùè ðàçøèðåíèÿ è çà ïî-ãîëÿìà Perl-ñúâìåñòèìîñò) è ïðèåìà ïîâå÷å îò åäíà öèôðà. Àêî èñêàòå äà çàïèøåòå ïðîñòî ñèìâîëèòå '$' èëè '\', çàïèøåòå ïðåä òÿõ '\' Ïðèìåð: '1\$ is $2\\rub\\' -> '1$ is <Match[2]>\rub\' Àêî èñêàòå äà çàïèøåòå îáèêíîâåíà öèôðà ñëåä '$n', ùå òðÿáâà äà çàãðàäèòå n ñ ôèãóðíè ñêîáè '{}'. Ïðèìåð: 'a$12bc' -> 'a<Match[12]>bc', a${1}2bc' -> 'a<Match[1]>2bc'. procedure Split (AInputStr : string; APieces : TStrings); Ðàçäåëÿ AInputStr íà ïàð÷åòà â APieces ñïîðåä ñðåùàíåòî íà RE. Èçïîëçâà Exec [Next]. function Replace (AInputStr : RegExprString; const AReplaceStr : RegExprString; AUseSubstitution : boolean = False) : RegExprString; Âðúùà AinputStr, â êîéòî ñðåùàíèÿòà íà RE ñà çàìåíåíè ñ AreplaceStr. Àêî AUseSubstitution å true, òîãàâà AReplaceStr ùå ñå èçïîëçâà êàòî øàáëîí çà ìåòîäèòå Substitution. Ïðèìåð: Expression := '({-i}block|var)\s*\(\s*([^ ]*)\s*\)\s*'; Replace ('BLOCK( test1)', 'def "$1" value "$2"', True); ùå âúðíå: def 'BLOCK' value 'test1' Replace ('BLOCK( test1)', 'def "$1" value "$2"', False) ùå âúðíå: def "$1" value "$2" Èçïîëçâà Exec[Next] function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : string; AUseSubstitution : boolean = False) : string; Âðúùà AinputStr, â êîéòî ñðåùàíèÿòà íà RE ñà çàìåíåíè ñ AreplaceStr. Àêî AUseSubstitution å true, òîãàâà AReplaceStr ùå ñå èçïîëçâà êàòî øàáëîí çà ìåòîäèòå Substitution. Ïðèìåð: ReplaceRegExpr ('({-i}block|var)\s*\(\s*([^ ]*)\s*\)\s*', 'BLOCK( test1)', 'def "$1" value "$2"', True) ùå âúðíå: def 'BLOCK' value 'test1' ReplaceRegExpr ('({-i}block|var)\s*\(\s*([^ ]*)\s*\)\s*', 'BLOCK( test1)', 'def "$1" value "$2"') ùå âúðíå: def "$1" value "$2" property SubExprMatchCount : integer; // ReadOnly Âðúùà áðîÿ íà ïîäèçðàçèòå, íàìåðåíè ïðè ïîñëåäíîòî èçâèêâàíå íà Exec*. Àêî íÿìà ïîäèçðàçè, à å íàìåðåí ñàìî öåëèÿò èçðàç (Exec* å âúðíàëà True), òî SubExprMatchCount=0, à àêî íå ñà íàìåðåíè íèòî ïîäèçðàçè, íèòî öåëèÿ RE (Exec* å âúðíàëà false), òî SubExprMatchCount=-1. Çàáåëåæåòå, ÷å íÿêîè ïîäèçðàçè ìîæå è äà íå áúäàò íàìåðåíè è çà òÿõ MathPos=MatchLen= -1 è Match=''. Ïðèìåð: Èçðàç := '(1)?2(3)?'; Exec ('123'): SubExprMatchCount=2, Match[0]='123', [1]='1', [2]='3' Exec ('12'): SubExprMatchCount=1, Match[0]='12', [1]='1' Exec ('23'): SubExprMatchCount=2, Match[0]='23', [1]=", [2]='3' Exec ('2'): SubExprMatchCount=0, Match[0]='2' Exec ('7') - âðúùà False: SubExprMatchCount=-1 property MatchPos [Idx : integer] : integer; // ReadOnly ïîçèöèÿ íà íàìåðåíèÿ ïîäèçðàç. #Idx å íîìåðà íà ïîäèçðàçà â ïîñëåäíèÿ ñòðèíã íà Exec*. Ïúðâèÿò ïîäèçðàç èìà Idx=1, ïîñëåäíèÿ - MatchCount, öåëèÿ èçðàç èìà Idx=0. Âðúùà -1 àêî â èçðàçà íÿìà òàêúâ ïîäèçðàç èëè àêî òîé íå å íàìåðåí. property MatchLen [Idx : integer] : integer; // ReadOnly äúëæèíà íà íàìåðåíèÿ ïîäèçðàç. #Idx å íîìåðà íà ïîäèçðàçà â ïîñëåäíèÿ ñòðèíã íà Exec*. Ïúðâèÿò ïîäèçðàç èìà Idx=1, ïîñëåäíèÿ - MatchCount, öåëèÿ èçðàç èìà Idx=0. Âðúùà -1 àêî â èçðàçà íÿìà òàêúâ ïîäèçðàç èëè àêî òîé íå å íàìåðåí. property Match [Idx : integer] : string; // ReadOnly == copy (InputString, MatchPos [Idx], MatchLen [Idx]) Âðúùà '' àêî â èçðàçà íÿìà òàêúâ ïîäèçðàç èëè àêî òîé íå å íàìåðåí. function LastError : integer; Âðúùà íîìåðà íà ïîñëåäíàòà ãðåøêà èëè 0 àêî íÿìà ãðåøêè (íåèçïîëçâàåì àêî ìåòîäúò Error ãåíåðèðà èçêëþ÷åíèå) è óñòàíîâÿâà âúòðåøíèÿ ñòàòóñ â 0 (íÿìà ãðåøêè). function ErrorMsg (AErrorID : integer) : string; virtual; Âðúùà ñúîáùåíèå çà ãðåøêà ñ íîìåð = AErrorID. property CompilerErrorPos : integer; // ReadOnly Âðúùà ïîçèöèÿòà â èçðàçà, êúäåòî êîìïèëàòîðúò å ñïðÿë. Ïîëåçíî ïðè äèàãíîñòèêà íà ãðåøêè property SpaceChars : RegExprString Ñúäúðæà ñèìâîëèòå, òðåòèðàíè êàòî \s (èíèöèàëèçèðà ñå ñ ãëîáàëíàòà êîíñòàíòà RegExprSpaceChars. property WordChars : RegExprString; Ñúäúðæà ñèìâîëèòå, òðåòèðàíè êàòî \w (èíèöèàëèçèðà ñå ñ ãëîáàëíàòà êîíñòàíòà RegExprWordChars. property LineSeparators : RegExprString ðàçäåëèòåëèòå íà ðåäîâå (êàòî \n â Unix), (èíèöèàëèçèðà ñå ñ ãëîáàëíàòà êîíñòàíòà RegExprLineSeparators. Âèæ ñúùî çà ðàçäåëèòåëèòå property LinePairedSeparator : RegExprString ñäâîåíè ðàçäåëèòåëè íà ðåäîâå (êàòî \r\n â DOS è Windows). Òðÿáâà äà ñúäúðæà òî÷íî äâà ñèìâîëà èëè äà íå ñúäúðæà íèùî (èíèöèàëèçèðà ñå ñ ãëîáàëíàòà êîíñòàíòà RegExprLinePairedSeparator). Âèæ ñúùî çà ðàçäåëèòåëèòå Íàïðèìåð, àêî èìàòå íóæäà îò Unix-ñòèë, çàäàéòå LineSeparators := #$a (ñèìâîë çà íîâ ðåä) è LinePairedSeparator := '' (ïðàçåí ñòðèíã), à àêî èñêàòå äà îáðàáîòâàòå ðàçäåëèòåëÿ \x0D\x0A, íî íå \x0D èëè \x0A, çàäàéòå LineSeparators := '' (ïðàçåí ñòðèíã) è LinePairedSeparator := #$d#$a. Ïî ïîäðàçáèðàíå ñå èçïîëçâà 'ñìåñåí' ðåæèì (äåôèíèðàí â ãëîáàëíèòå êîíñòàíòè RegExprLine[Paired]Separator[s]): LineSeparators := #$d#$a; LinePairedSeparator := $#d#$a. Äåéñòâèåòî íà òîçè ðåæèì å ïîäðîáíî îáÿñíåíî â ðàçäåëà, êàñàåù ñèíòàêñèñà. class function InvertCaseFunction (const Ch : REChar) : REChar; Êîíâåðòèðà Ch â ãîðåí ðåãèñòúð (àêî å áèë â äîëåí) èëè â äîëåí ðåãèñòúð (àêî å áèë â ãîðåí), êàòî èçïîëçâà ñèñòåìíèòå íàñòðîéêè. property InvertCase : TRegExprInvertCaseFunction; Àêî èñêàòå äà ðàáîòèòå ñúñ çàâèñèìîñò îò ðåãèñòúðà íà ñèìâîëèòå, óñòàíîâåòå òîâà ñâîéñòâî äà ñî÷è RegExprInvertCaseFunction (ïî ïîäðàçáèðàíå ñî÷è InvertCaseFunction) procedure Compile; [Ðå]êîìïèëèðà RE. Ïîëåçíà çà ðåäàêòîðè, èçïîëçâàùè RE â GUI (çà ïðîâåðêà íà âàëèäíîñòòà íà âñè÷êè ñâîéñòâà). function Dump : string; ïîêàçâà êîìïèëèðàíèÿò èçðàç â ïî-ïîäðîáåí âèä. class function VersionMajor: integer; class function VersionMinor: integer; Âðúùàò ãëàâíàòà è âòîðîñòåïåííàòà âåðñèÿ, íàïðèìåð çà v. 0.944 VersionMajor = 0 è VersionMinor = 944 Ãëîáàëíè êîíñòàíòè Ñòîéíîñòè ïî ïîäðàçáèðàíå íà ìîäèôèêàòîðèòå: RegExprModifierI : boolean = False; // TRegExpr.ModifierI RegExprModifierR : boolean = True; // TRegExpr.ModifierR RegExprModifierS : boolean = True; // TRegExpr.ModifierS RegExprModifierG : boolean = True; // TRegExpr.ModifierG RegExprModifierM : boolean = False; // TRegExpr.ModifierM RegExprModifierX : boolean = False; // TRegExpr.ModifierX RegExprSpaceChars : RegExprString = ' '#$9#$A#$D#$C; // ñòîéíîñò ïî ïîäðàçáèðàíå çà ñâîéñòâîòî SpaceChars RegExprWordChars : RegExprString = '0123456789' + 'abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'; // ñòîéíîñò ïî ïîäðàçáèðàíå çà ñâîéñòâîòî WordChars RegExprLineSeparators : RegExprString = #$d#$a{$IFDEF UniCode}#$b#$c#$2028#$2029#$85{$ENDIF}; // ñòîéíîñò ïî ïîäðàçáèðàíå çà ñâîéñòâîòî LineSeparators RegExprLinePairedSeparator : RegExprString = #$d#$a; // ñòîéíîñò ïî ïîäðàçáèðàíå çà ñâîéñòâîòî LinePairedSeparator RegExprInvertCaseFunction : TRegExprInvertCaseFunction = TRegExpr.InvertCaseFunction; // ñòîéíîñò ïî ïîäðàçáèðàíå çà ñâîéñòâîòî InvertCase Ïîëåçíè ãëîáàëíè ôóíêöèè function ExecRegExpr (const ARegExpr, AInputStr : string) : boolean; âðúùà èñòèíà àêî â ñòðèíãà AInputString ñå îòêðèå ñúâïàäåíèå íà èçðàçà ARegExpr ! àêî â AregExpr èìà ñèíòàêòè÷íè ãðåøêè, ãåíåðèðà èçêëþ÷åíèå procedure SplitRegExpr (const ARegExpr, AInputStr : string; APieces : TStrings); ðàçäåëÿ AInputStr íà ïàð÷åòà â APieces ñïîðåä ñðåùàíèÿòà íà ARegExpr function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : string) : string; Âðúùà AinputStr, êàòî ñðåùàíèÿòà íà èçðàçà ARegExpr ñà çàìåíåíè ñ AReplaceStr function QuoteRegExprMetaChars (const AStr : string) : string; Çàìåíÿ âñè÷êè ìåòàñèìâîëè ñ òÿõíàòà áåçîïàñíà ôîðìà, íàïðèìåð 'abc$cd.(' ñå êîíâåðòèðà â 'abc\$cd\.\(' Òàçè ôóíêöèÿ å ïîëåçíà ïðè àâòîìàòè÷íî ãåíåðèðàíå íà èçðàçè îò ïîòðåáèòåëñêè âõîä function RegExprSubExpressions (const ARegExpr : string; ASubExprs : TStrings; AExtendedSyntax : boolean = False) : integer; Ïðàâè ñïèñúê íà ïîäèçðàçèòå, íàìåðåíè â RE ARegExpr  ASubExps âñÿêà ñòîéíîñò ïðåäñòàâëÿâà ïîäèçðàç, îò ïúðâèÿ äî ïîñëåäíèÿ, âúâ ôîðìàò: String òåêñò íà ïîäèçðàçà (áåç '()') low word íà Object ñòàðòîâà ïîçèöèÿ â ARegExpr, âêë. '(' àêî ñúùåñòâóâà! (ïúðâàòà ïîçèöèÿ å 1) high word íà Object - äúëæèíàòà, âêë. '(' è ')' àêî ñúùåñòâóâàò! AExtendedSyntax òðÿáâà äà å True àêî ìîäèôèêàòîðúò /x å âêëþ÷åí ïðè èçïîëçâàíåòî íà RE. Ïîëåçíà çà ðåäàêòîðè íà RE â GUI è ò.í. (Ïðèìåð çà èçïîëçâàíå èìà â ïðîåêòà TestRExp.dpr) Ðåçóëòàò Çíà÷åíèå 0 Óñïåõ. Íÿìà íàìåðåíè íåáàëàíñèðàíè ñêîáè. -1 íÿìà äîñòàòú÷íî çàòâàðÿùè ñêîáè ')' -(n+1) íà ïîçèöèÿ n å íàìåðåíà îòâàðÿùà '[' áåç ñúîòâåòñòâàùà é çàòâàðÿùà ']' n íà ïîçèöèÿ n å íàìåðåíà çàòâàðÿùà ')' áåç ñúîòâåòñòâàùà é îòâàðÿùà '(' àêî ðåçóëòàòúò å <> 0, òî ASubExpr ñúäúðæà ïðàçíè èëè íåêîðåêòíè ñòðèíãîâå. Êëàñ 'èçêëþ÷åíèå' Òîé îáðàáîòâà ãðåøêèòå íà TRegExpr: ERegExpr = class (Exception) public ErrorCode : integer; // êîä çà ãðåøêà. Êîäîâåòå çà ãðåøêà ïðè êîìïèëèðàíå ñà < 1000. CompilerErrorPos : integer; // Ïîçèöèÿ â èçðàçà, êúäåòî å âúçíèêíàëà ãðåøêàòà end; Êàê äà èçïîëçâàìå Unicode TRegExpr ïîääúðæà UniCode, íî ðàáîòè ñ íåãî ìíîãî áàâíî :( Íÿêîé èñêà ëè äà ãî îïòèìèçèðà ? ;) Èçïîëçâàéòå ãî ñàìî àêî íàèñòèíà âè òðÿáâà ïîääðúæêà íà Unicode ! Ïðåìàõíåòå '.' îò {.$DEFINE UniCode} â regexpr.pas. Ñëåä òîâà âñè÷êè ñòðèíãîâå ùå áúäàò òðåòèðàíè êàòî WideString. |
![]() |