Autor Téma: Regex na Delphi komentáře  (Přečteno 464 krát)

Offline PetrB0

  • Nováček
  • *
  • Příspěvků: 43
  • Karma: 1
    • Verze Delphi: Delphi XE2
Regex na Delphi komentáře
« kdy: 10-01-2019, 23:35:07 »
Ahoj,
na "stará kolena" jsem si začal hrát s regulárními výrazy pod Delphi. Něco už jsem schopný dát do kupy, ale tentokrát jsem selhal.
Chci z delphi zdrojového kódu odstranit komentáře {} a to jak jednořádkové, tak více řádkové.
Testuji si to na stránce https://regex101.com/

Jednořádkový odstraňuji přes masku '\{.*?\}'
Pro víceřádkový jsem si otestoval '\{(.|[\s])*?\}'.

Když to spustím v delphi XE10.2 přes kód

Kód: Delphi [Vybrat]
  1. Function Cisti(Vst : String) : String;
  2. Const
  3.          cPattern = ...
  4.  Begin
  5.   Result:=TRegEx.Replace(Vst,cPattern,'',[roMultiline,roIgnoreCase]);
  6.  End;
  7.  
tak pro cPattern je jednořádková maska to funguje.
Pro víceřádkovou mi Delphi nahlásí "Stack overflow" někde v knihovně pcre_exec.c.

Kde dělám chybu?

Díky

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 919
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:Regex na Delphi komentáře
« Odpověď #1 kdy: 11-01-2019, 08:10:13 »
Neumí toto nějaká funkce v CNWizards nebo v GExperts?

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1390
  • Karma: 34
    • Pepak.net
Re:Regex na Delphi komentáře
« Odpověď #2 kdy: 11-01-2019, 17:26:16 »
Místo Multiline použij Singleline. Pak tečka i \s vezmou i konce řádků, bez ohledu na to, kolik jich je.

Offline PetrB0

  • Nováček
  • *
  • Příspěvků: 43
  • Karma: 1
    • Verze Delphi: Delphi XE2
Re:Regex na Delphi komentáře
« Odpověď #3 kdy: 11-01-2019, 20:24:43 »
Jaro, to je možné, ale já si to chci z "cvičných důvodů" napsat sám.

Pepaku, to jsem myslím také zkoušel a padlo to stejně, ale ještě se na to podívám.

Offline PetrB0

  • Nováček
  • *
  • Příspěvků: 43
  • Karma: 1
    • Verze Delphi: Delphi XE2
Re:Regex na Delphi komentáře
« Odpověď #4 kdy: 11-01-2019, 23:47:34 »
Tak tomu nerozumím. Zkusil jsem to jako single line a poprvé to fungovalo. (ale to bylo patrně proto, že na single line požral většinu textu ten 3. record a na 4. už nic nezbylo)
No a teď už zase ne.

tady je kód:
Kód: Delphi [Vybrat]
  1. Procedure ZrusKomentare(Var Vst : String);
  2. Type
  3.     TReplaceRec = Record
  4.                    pattern : String;
  5.                    novy    : String;
  6.                    Options : TRegExOptions;
  7.                    OnOff   : Boolean;
  8.                   End;
  9.     TAReplaceRec = Array [1..5] Of TReplaceRec;
  10. Const
  11.      cSeznam : TAReplaceRec = (
  12.                                (
  13.                                 pattern:'\/{2}.*$';  //Zruší řádkovou poznámku do konce řádku
  14.                                 novy   :'';
  15.                                 Options:[roIgnoreCase,roMultiline];
  16.                                 OnOff  :true
  17.                                ),
  18.                                (
  19.                                 pattern:'\{\$.*?\}';  //Zruší překladačové podmínky, zatím
  20.                                 novy   :'';
  21.                                 Options:[roIgnoreCase,roMultiline];
  22.                                 OnOff  :true
  23.                                ),
  24.                                (
  25.                                 pattern:'\{.*?\}';    //Zruší jednořádkový komentář
  26.                                 novy   :'';
  27.                                 Options:[roIgnoreCase,roMultiline];
  28.                                 OnOff  :true
  29.                                ),
  30.                                (
  31.                                 pattern:'\{(.|[\s])*?\}';    //Zruš víceřádkový komentář
  32.                                 novy   :'';
  33.                                 Options:[roIgnoreCase,roSingleLine];
  34.                                 OnOff  :true
  35.                                ),
  36.                                (
  37.                                 pattern:'uses(.|\s)*?;';    //Zruš sekce uses
  38.                                 novy   :'';
  39.                                 Options:[roIgnoreCase,roMultiLine];
  40.                                 OnOff  :true
  41.                                )
  42.                               );
  43. Var
  44.    __I : Integer;
  45.  begin
  46.   for __I := Low(cSeznam) to High(cSeznam) do
  47.    if cSeznam[__I].OnOff then
  48.     Vst:=TRegEx.Replace(Vst,cSeznam[__I].Pattern,cSeznam[__I].Novy,cSeznam[__I].Options);
  49.  end;
  50.  

Chybu mi to hází při čtvrtém prvku. Project raised exception class $C00000FD with message 'stack overflow at 0x004e0d15'. A vede mne to do pcre_exec.c, ale pro to nemám zdrojový kód.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: