|
You last visited: Today at 08:39
Advertisement
RegExp Verschachtelung
Discussion on RegExp Verschachtelung within the Web Development forum part of the Coders Den category.
01/29/2015, 12:20
|
#1
|
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
|
RegExp Verschachtelung
Hallo,
ich habe gerade ein kleines aber doch großes Problem welches ich nicht durch Google finden konnte bzw. nicht die Lösung
Ich habe z.B. folgenden String:  (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?
MfG
Mr.Tr33
|
|
|
01/29/2015, 18:25
|
#2
|
elite*gold: 74
Join Date: Jul 2010
Posts: 13,408
Received Thanks: 3,943
|
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
|
#3
|
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
|
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 endet.
|
|
|
01/29/2015, 19:53
|
#4
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
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
|
#5
|
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
|
Quote:
Originally Posted by Tasiro
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
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
|
#6
|
elite*gold: 74
Join Date: Jul 2010
Posts: 13,408
Received Thanks: 3,943
|
Dann ist das mal wieder ein Paradebeispiel für nen Stack ;o
Damit erreicht du genau das.
|
|
|
01/30/2015, 20:03
|
#7
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
Quote:
Originally Posted by Mr.Tr33
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
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
|
#8
|
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
|
Quote:
Originally Posted by Tasiro
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
|
#9
|
elite*gold: 2778
Join Date: Feb 2012
Posts: 3,527
Received Thanks: 1,044
|
Quote:
Originally Posted by dowhile
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
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
|
#10
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
Quote:
Originally Posted by dowhile
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
Ein Beispiel wäre dabei immer hilfreich 
|

Und noch ein paar mehr Links zu dem Thema:
|
|
|
 |
Similar Threads
|
String Between | String regexp
06/07/2013 - AutoIt - 7 Replies
Huhu,
undzwar habe ich ein problem hiermit: <li class="lab">Benutzername:</li>
<li>Salmor</li>
ich will salmor auslesen, wenn ich allerdings sage:
$Benutzername = _StringBetween($sHTML, 'Benutzername:</li><li>', '</li>')
kommt es zu keiner Lösung, evtl kann mir jemand helfen.
|
StringSplit mit RegExp
03/27/2013 - AutoIt - 7 Replies
Hi,
ich versuche gerade einen Text in seine Sätze zu zerteilen. Ist es möglich das man mit StringSplit oder StringRegExp Texte splittet und als trennzeichen "!","?" und "." nimmt ? Weiterhin will ich das nach einer dieser zeichen ein Großbuchstabe folgen muss. Würde das gehen bzw. wie ?
|
[S] JavaScript RegExp Datum Pattern [B] 5 E*Gold
08/05/2012 - elite*gold Trading - 2 Replies
^Topic
Suche ein JavaScript Pattern was mir ein deutsches Datum prüft.
Also:TT.MM.JJJJ
Einfach Pattern hier in den Thread schreiben.
Der, der mir das beste Pattern Liefern kann wird mit 5 E*Gold belohnt.
Da ich gleich Off muss (19:00) und am Di weg bin, fälle ich die Entscheidung wer den besten Pattern mir geliefert hat wahrscheinlich erst am Mi.
Heißt:Auch erst am Mittwoch gibts die 5 E*Gold.
|
If-Then-Verschachtelung
08/11/2011 - AutoIt - 1 Replies
Hallo,
Ich würde gerne eine Verschachtelung durchführen.
While True
If WinExists("leben","Fehlermeldung&qu ot;)
Then WinClose("leben","Fehlermeldung&quo t;)
If WinExists("Mozilla-Absturz-Melder")
Then MouseClick("left", 856, 571, 1, 0)
Then MouseClick("left", 856, 571, 1, 0)
|
[Help] How do I change RegExp for skills?
08/22/2010 - CO2 Private Server - 8 Replies
my sactter skill get up very fast levels
how do I edit the skill exp requirment?
source 5165
|
All times are GMT +1. The time now is 08:39.
|
|