PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regex zur Packeterkennung Problem


immes
29.11.2004, 08:40
Hallo
schönen Gruss erstmal an alle hier im Forum!!

Ich benötige ein Regex mit dem ich einen String auf selbstgebaute Packete überprüfen kann.
Ein Packet ist alles mit dieser Formatierung:
<STARTTAG>10 Ziffern Hashcode Beliebige Daten<ENDTAG>
also z.B.: <STARTTAG>1212002340Hallo mein Name ist Hase<ENDTAG>
alles was anders formatiert ist soll nicht erkannt werden

Hierbei ist jetzt das Problem, dass es zwischen <STARTTAG> und <ENDTAG> kein weiters <STARTTAG> mehr geben darf. (Wäre ja ein nicht gültiges Packet)
<STARTTAG>1212002340Hallo<STARTTAG>mein Name ist Hase<ENDTAG>
darf also vom Regex nicht gefunden werden.

Meine Lösung (die schon sehr viel Zeit gekostet hat) ist:
"<STARTTAG>{1}\d{10}(?!<STARTTAG>)(.*?)(?<!<STARTTAG>)</STARTTAG>{1}"

Diese funktioniert bis auf die Tatsache dass ein <STARTTAG>, das sich eingeschlossen im Datenteil befindet, als Packet erkannt wird.
Ich möchte also für den Datenteil alle Zeichen Zulassen außer dem Wort <STARTTAG>


Vielen Dank für eure Hilfe

cu

immes


Jan Krüger
29.11.2004, 11:43
Ich kann es jetzt nicht formal beweisen, aber meiner Erfahrung nach lässt sich das nicht mit einem einzelnen regulären Ausdruck lösen -- der String "<STARTTAG>1234567890abcde<STARTTAG>abcde<ENDTAG>" würde immer zutreffen, denn sowas können Assertions nicht finden. Wenn du einen Regex-Dialekt mit einer Art Rematching auf Submatches findest, kannst du vielleicht mit einem einzigen Ausdruck auskommen, aber generell nicht.

immes
29.11.2004, 12:22
Hi,

ich benutze das Regex von VB.net

es müsst doch möglich sein zu sagen jedes beliebige Zeichen aber nicht die Zeichenfolge <STARTTAG>. (so ähnlich wie hier :
"[^0-9 a-z A-Z ]|(script)|(javascript)" )
sobald was eingegeben wird was außerhalb der Zeichen ODER eines der Wörter ist wird es erkannt.

Oder :"Nur jedes Zeichen wenn davor oder danach nicht <STARTTAG> steht.
Das funktioniert ja in meinem Regex auch ,halt nur im Bereich des Anfangs (vor,zwischen,nach: <STARTTAG>Hashcode) oder des Endes (vor <ENDTAG>)

Vielleicht fällt ja noch jemand was ein, wäre super!

PS was wäre die Variante mit mehr als einer Regex?


cu

immes

Jan Krüger
29.11.2004, 15:43
Es tut mir wirklich Leid, aber ich sehe immer noch keine Möglichkeit, es mit einem Ausdruck zu machen, und ich kenne auch sonst niemanden, der eine sieht. Grob gesagt kannst du keine Aussage der Art "beliebig viel hiervon, das nicht diese und jene Zeichenfolge beinhaltet" machen.

Mit mehreren Ausdrücken würdest du den String einfach zweimal kontrollieren: erst auf passenden Start- und Endtag und Hash, danach darauf, dass im inneren Teil (per Submatch rausziehen) der Starttag nicht nochmal vorkommt. Wenn er beide Tests besteht, ist dein Paket gültig.

immes
29.11.2004, 16:29
Schade
trotzdem Danke.
Könntest Du genauer beschreiben wie das mit dem submatch geht (so dass ich im zweiten regex eine Untermenge des ersten habe?!?)

Gruss


immes

Jan Krüger
29.11.2004, 17:01
Normalerweise einfach in Klammern setzen (.*?) und wie man den Submatch dann abruft, hängt von der Sprache, also hier VB.NET ab. Von VB* hab ich keine Ahnung, also musst du leider selbst nachgucken. :)

immes
29.11.2004, 17:23
dank Dir

Gruss

immes