RegEx gesucht

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

RegEx gesucht

Beitrag von monta »

Da ich mit Regulären Ausdrücken ziemlich auf Kriegsfuß stehe und _X_ mich aber auf einen Fehler im Highlighter aufmerksam gemacht hat, frag ich mal, irgendwer wird Reguläre Ausdrücke ja in ausreichendem Umfang verstanden haben :mrgreen:

Die Problemstellung:

Code: Alles auswählen

{$define2} //{$auskommentiertes define}
{$define2} {{$auskommentiertes define}}
//{$auskommentiertes define}
{{$auskommentiertes define}}


Das Problem ist also, das auch ein define erkannt wird, wenn es eigentlich von einem Kommentar überlagert wird :?:

Aktuell steht da folgende Expression: '/{\\$.*?}|\\(\\*\\$.*?\\*\\)/U' aber die versagt halt, weil Kommentarzeichen nicht berücksichtigt werden. Hat jemand eine Lösung, die zusätzlich berücksichtigt, das keine Kommentarzeichen vor dem define stehen dürfen?
Johannes

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: RegEx gesucht

Beitrag von theo »

monta hat geschrieben:Da ich mit Regulären Ausdrücken ziemlich auf Kriegsfuß stehe


Ich auch. Vllt kannst du dich damit durchmogeln: http://txt2regex.sourceforge.net/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: RegEx gesucht

Beitrag von monta »

sieht interessant aus, werd ich, wenn ich wieder unter Linux bin, mal probieren.
Johannes

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: RegEx gesucht

Beitrag von martin_frb »

Also ich weis nicht welche reg-ex Engine dahinter steht.

In Perl geht folgendes: (?<! xxx ) wobei xxx der term ist der *nicht* *vor* dem nächsten Match stehen darf.

folgende Möglichkeiten lösen das Problem zumindest teilweise:

[^{] oder in manchen regex engines \[^{\] => matcht alles außer {, allerdings muss da ein Zeichen stehen, daher würden define am Anfang des Textes nicht erkannt.
Wenn die regex engine den term unten nicht nimmt / keine "look behind" unterstützt:
(^|[^{]) am Zeilenanfang, oder hinter einem Zeichen außer {

(^|(^|[^\/])\/|[^\/{]) sollte sowohl { als auch // erkennen.
Im Detail erklaert
(^ am text anfang (je nach engine, am zeilenanfeng)
|
ein / ist erlaubt wenn er am text-anfang steht, oder nicht hinter einem 2ten /
5/{$define x} 1
(^|[^\/]) \/
|
[^\/{] // nicht hinter einem { oder /
)


(?<!{)(?<!\/\/) verbietet sowohl \\ als auch { direkt vor dem define (wenn die regex engine "look behind" expressions unterstützt)
'/(?<!{)(?<!\/\/){\\$.*?}|(?<!{)(?<!\\/\\/)\\(\\*\\$.*?\\*\\)/U'


Allerdings beschränkt sich das auf den fall, das // oder { DIREKT vor dem define steht.

Ein define kann aber irgendwo in einem Kommentar stehen. Das ist dann mit regex nicht mehr zu machen. Jedenfalls fällt mir da nix praktikables ein.

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: RegEx gesucht

Beitrag von martin_frb »

Hm, also IMHo erkennt er den Fall, dass das define im einem Kommentar steht.

Allerdings erkennt er nicht immer das Ende eines define korrekt

Code: Alles auswählen

//{$define a}
a := 1
b; // a := 1
b; {$define a} // a := 1
{$define a} b; // a := 1
{$define a} // a := 1
{$define a} // a := 1 {$define a}
{$define a}  // {$define a}
{$define a}  //{$define a}
{$define a} a:= 1;  //{$define a}


In der letzten Zeile wird nicht mal a := 1 erkannt.

Die regex sieht eigentlich korrekt aus
'/{\\$.*?}|\\(\\*\\$.*?\\*\\)/U'

probier mal:
'/{\\$\\[^}\\]*?}|\\(\\*\\$.*?\\*\\)/U'
bzw
'/{\\$[^}]*?}|\\(\\*\\$.*?\\*\\)/U'

je nachdem ob [] einen Backslash braucht oder nicht

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: RegEx gesucht

Beitrag von monta »

Danke Martin, dafür bekommst du den Forenorden ;)

Die Engine ist PHP, und deine zweite RegEx funktioniert, siehe mit neuer Regex:

Code: Alles auswählen

//{$define a}
a := 1
b; // a := 1
b; {$define a} // a := 1
{$define a} b; // a := 1
{$define a} // a := 1
{$define a} // a := 1 {$define a}
{$define a}  // {$define a}
{$define a}  //{$define a}
{$define a} a:= 1//{$define a}

:D
Johannes

Antworten