RegExp Verschachtelung

01/29/2015 12:20 Mr.Tr33#1
Hallo,
ich habe gerade ein kleines aber doch großes Problem welches ich nicht durch Google finden konnte bzw. nicht die Lösung :D

Ich habe z.B. folgenden String: [Only registered and activated users can see links. Click Here To Register...] (er wird hier komischerweise falsch dargestellt bzw. voll verkrüppelt)
So, ich kann jetzt Problemlos nach LIST und /LIST suchen, dann würde ich aber entweder auf das erste /LIST treffen, oder das aller letzte /LIST
Ich finde aber nicht das nur dazugehörige.
Kennt jemand dafür eine Lösung?
Am besten eine PHP freundliche? :D

MfG
Mr.Tr33
01/29/2015 18:25 .StarSplash#2
Nicht mit einfachem preg_match suchen, sondern mit preg_match_all. Dann kriegst du ein Array mit allen Treffern zurück.
01/29/2015 19:26 Mr.Tr33#3
Dies ist mir bewusst.
Wenn ich folgenden Pattern benutze: \[list\](.*?)\[/list\]
Dann bekomme ich das wieder:
Code:
[LIST][*]a[*][LIST][*]hans[*]peter[*]baum[/LIST]
Wenn ich aber diesen Pattern benutze: \[list\](.*)\[/list\]
Dann bekomme ich einfach alles wieder, was ich ihm als String gegeben habe, weil es eben mit
  • anfängt und
endet.
01/29/2015 19:53 Tasiro#4
Du versuchst, eine kontextfreie Sprache mit einem regulären Ausdruck zu beschreiben. Das ist nur in speziellen Fällen möglich; wenn die Sprache nicht nur kontextfrei, sondern auch regulär ist. Das ist aber in deinem Fall nicht so.

Mit anderen Worten: Es gibt keine Lösung allein mit regulären Ausdrücken für dein Problem.

Du könntest es mit einem rekursiv absteigenen Parser versuchen, ein solcher ist in der Regel recht einfach zu schreiben.
Davon abgesehen hast du nicht dein Ziel genannt, nur den Weg.
01/29/2015 19:59 Mr.Tr33#5
Quote:
Originally Posted by Tasiro View Post
Mit anderen Worten: Es gibt keine Lösung allein mit regulären Ausdrücken für dein Problem.
Könntest du mir vielleicht ein Beispiel dazu geben bitte? :)

Quote:
Originally Posted by Tasiro View Post
Du könntest es mit einem rekursiv absteigenen Parser versuchen, ein solcher ist in der Regel recht einfach zu schreiben.
Davon abgesehen hast du nicht dein Ziel genannt, nur den Weg.
Ich möchte am Ende dass es das erste LIST mit demzweiten /LIST als ein Paar sieht, das zweite LIST und das erste /LIST und dann halt das 3te LIST und das 3te /LIST als ein Paar. Sprich die dazugehörigen Teile und nicht einfach die als erstes, egal von welcher Richtung, im Weg stehen.
01/29/2015 20:19 .StarSplash#6
Dann ist das mal wieder ein Paradebeispiel für nen Stack ;o
Damit erreicht du genau das.
01/30/2015 20:03 Tasiro#7
Quote:
Originally Posted by Mr.Tr33 View Post
Könntest du mir vielleicht ein Beispiel dazu geben bitte? :)
Standardbeispiel: Sei L = {aⁿbⁿ : n∈ℕ, n≠0}, die Sprache der Wörter ab, aabb, aaabbb usw. Es muss also für jedes a genau ein b vorhanden sein. Das lässt sich nicht mit einem endlichen Automat realisieren, da bei m Zuständen spätestens bei dem m+1. a wieder ein Zustand eingenommen wird, der sich von einem bereits vorher angenommenen Zustand nicht unterscheiden lässt.
Damit lässt sich das nicht mit einem DEA und damit auch nicht mit einem regulären Ausdruck beschreiben.

Dein Problem ist ähnlich, bei dir können zwischen jedem [LIST]-[/LIST]-Paar nicht nur ein weiteres Paar stehen, sondern mehrere, dazu noch anderer Text. Das macht die Aufgabe natürlich nicht einfacher.


Quote:
Originally Posted by Mr.Tr33 View Post
Ich möchte am Ende dass es das erste LIST mit demzweiten /LIST als ein Paar sieht, das zweite LIST und das erste /LIST und dann halt das 3te LIST und das 3te /LIST als ein Paar. Sprich die dazugehörigen Teile und nicht einfach die als erstes, egal von welcher Richtung, im Weg stehen.
Warum möchtest du die Paare paaren?

Wenn du einen Baum deiner Paare erstellen möchtest, könntest du das etwa so machen:
Code:
function parseCode (code, ref i)
    if code contains "[i]" at index i then
        i += length of "[i]"
        result = new BBCode ("i", parseCode (code, i))
        if code contains "[/i]" at index i then
            i += length of "[/i]"
        else
            writeErrorMessage ("missing [/i] at index " + i)
        end if

    else if ... // andere Fälle
        ...
    end if
end function
Oder du nutzt eine der vielen Bibliotheken dafür. Du musst bloß nach "BB Code Parser" und der gewünschten Sprache suchen.
02/01/2015 03:01 dowhile#8
Quote:
Originally Posted by Tasiro View Post
Du versuchst, eine kontextfreie Sprache mit einem regulären Ausdruck zu beschreiben. Das ist nur in speziellen Fällen möglich; wenn die Sprache nicht nur kontextfrei, sondern auch regulär ist. Das ist aber in deinem Fall nicht so.

Mit anderen Worten: Es gibt keine Lösung allein mit regulären Ausdrücken für dein Problem.
Reguläre Ausdrücke in Programmiersprachen sind in der Regel nicht regulär, sondern wesentlich mächtiger. In PHP gibt es sogar rekursive reguläre Ausdrücke, mit denen der TE sein Problem lösen können sollte.
02/01/2015 14:12 Mr.Tr33#9
Quote:
Originally Posted by dowhile View Post
Reguläre Ausdrücke in Programmiersprachen sind in der Regel nicht regulär, sondern wesentlich mächtiger. In PHP gibt es sogar rekursive reguläre Ausdrücke, mit denen der TE sein Problem lösen können sollte.
Ein Beispiel wäre dabei immer hilfreich :)

Quote:
Originally Posted by Tasiro View Post
Warum möchtest du die Paare paaren?
Ich möchte diese paaren damit ich beim kürzen des Codes (damit ich z.B. nur 800 Zeichen anzeigen lassen kann) es am Ende richtig anzeigen lassen kann.
02/01/2015 15:26 Tasiro#10
Quote:
Originally Posted by dowhile View Post
rekursive reguläre Ausdrücke
Interessant, was die sich alles einfallen lassen. Nur ist das hierfür nicht unbedingt eine gute Idee...

Quote:
Originally Posted by Mr.Tr33 View Post
Ein Beispiel wäre dabei immer hilfreich :)
[Only registered and activated users can see links. Click Here To Register...]
Und noch ein paar mehr Links zu dem Thema:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]