Einige Fragen zur RegEx Syntax

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Einige Fragen zur RegEx Syntax

    Hi,

    ich möchte RegEx verwenden um unformatierte HTML Files ein bissl lesbarer zu machen. Hier meine ersten Versuche:

    VB.NET-Quellcode

    1. Dim srcData As String = txtData.Text
    2. 'Remove all TABs
    3. srcData = Regex.Replace(srcData, "\t", NewLine & "")
    4. 'Remove all NEWLINEs
    5. srcData = Regex.Replace(srcData, NewLine, "")
    6. 'Insert NEWLINE before all start tags (but not at the beginning of data) (DOES NOT WORK!)
    7. srcData = srcData.Substring(0, 1) & Regex.Replace(srcData.Substring(1), "<[^/]", NewLine & "<.")
    8. txtData.Text = srcData


    Die ersten beiden Anweisungen funktionieren problemlos.

    Jetzt möchte ich aber gern vor das Starttag, z.B. <html> eine NEWLINE anfügen .... nicht aber vor das Endtag </html>

    Wenn ich da im Replace String einen Punkt angebe (für das zweite Byte des Suchstrings), wird der als Punkt eingefügt ... auch wenn ich den Punkt mit mit einem "Escape" versehe (also \.) klappt das nicht !

    Wie also übernehme ich denn das zweite Zeichen aus dem gefundenen String ?

    Ich hoffe, ich habe mein Anliegen verständlich machen können. Für alte RegEx "Hasen" dürfte das ein Klacks sein (hoffe ich jedenfalls) :)

    Vielleicht noch eine Zusatzfrage: wie würde ich an das EndTag eine NEWLINE anfügen ? Da muss ich eine variable lange Zeichenkette aus dem gefundenen String übernehmen ....

    LG
    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    Quellcode

    1. srcData = srcData.Substring(0, 1) & Regex.Replace(srcData.Substring(1), "<([^/])", NewLine & "<($1)")
    glaubich.
    Aber was nütztes dir? Ist doch kaum zu verstehen, und alles alles zu Regex erklären bin ich nicht imstande.

    Kanst dir Regextester - OpenSource downloaden - da ist die MS-Doku als WordDoc integriert.
    Ohne einen Regextester kriegt man eh keinen Regex zusammen.
    Nee, so klappt das leider nicht.

    Aber ich bin mir ziemlich sicher, dass so etwas möglich sein muss ... vielleicht weiß ja doch jemand, wie das geht.

    Ansonsten muss ich mich halt tatsächlich durch irgend ein Tuturial durchwursteln ... :) Na, in Zeiten des Corona Virus ist das ja vielleicht auch eine ganz nette Bechäftigung ... :)

    LG
    Peter
    Die Threads (RegEx-Tutorial, Reverse RegEx) von @Link hast Du wahrscheinlich schon gefunden.
    Online gibt's auch den ein oder anderen Debugger, z.B. debuggex
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed ... jau ... habe ich bereits gefunden.

    @EDR ... na ja, es gibt ja auch keine Fehlermeldung. Der fügt den Quatsch einfach so ein wie er da steht. Und das ist halt nicht ganz das, was ich will.

    Ich habe jetzt versucht mich schlau zu machen. Das Ganze funktioniert wohl durch die Rückbezugnahme über Gruppendefinitionen. Für alle, die vor ähnlichen Problemen stehen, könnte das folgende (funktionierende) Coding von Hilfe sein:

    VB.NET-Quellcode

    1. Dim srcData As String = txtData.Text
    2. 'Remove all TABs
    3. srcData = Regex.Replace(srcData, "\t", "")
    4. 'Remove all all NEWLINEs
    5. srcData = Regex.Replace(srcData, NewLine, "")
    6. 'Remove all intermediate blanks
    7. srcData = Regex.Replace(srcData, "> +?<", "><")
    8. 'Insert NEWLINE before all tags (but not at the beginning of data)
    9. srcData = srcData.Substring(0, 1) & Regex.Replace(srcData.Substring(1), "<", NewLine & "<")
    10. 'Insert NEWLINE after all end tags
    11. srcData = Regex.Replace(srcData, "(?<ETag></.*?>)", "${ETag}" & NewLine)
    12. 'Insert NEWLILNE after major tags
    13. srcData = Regex.Replace(srcData, "(?<MAJOR>\<(html|head|body).*\>)", "${MAJOR}" & NewLine)
    14. txtData.Text = srcData


    Damit kann man die HTML Datei schon sehr viel besser lesen. Allerding werden noch "zu viele" NEWLINEs generiert. Etwa das Coding

    VB.NET-Quellcode

    1. <script> .... </script> sollte so belassen werden wie es ist, wenn es kurz ist.


    @RFG

    Dein Vorschlag aus dem anderen Thread RegEx zu verwenden ist schon gut. Allerdings nur bis zu einem gewissen Grad. Die RegEx Syntax ist m.E. doch entschieden zu hakelig, um damit erfolgreich ein HTML Dokument zu formatieren. Und außerdem sind wohl Dinge wie "Indentation" damit nicht zu realisieren.

    Ich werde mich also wohl doch wieder darauf besinnen müssen, das HTML Dokument per "Schleife" zu bearbeiten ... allerdings über srcData.Substring(....) geht das dann doch quälend langsam vor sich, wenn das Dokument mehr z.B. als 1 MB umfasst! Vielleicht muss man die Eingabe in ein ByteArray umwandeln ... dann kann VB die Ausdrücke über Pointer addressieren ...

    Mich würde eure Meinung dazu interessieren, wie man so ein Problem am besten angeht ... wenn ihr Lust und Zeit dazu haben solltet... :)

    LG
    Peter
    Hi,

    keine Ahnung ob man es in VB anders oder besser lösen kann, du könntest aber irgendwo ein PHP-Skript ablegen das das erledigt und dann einfach von VB aus den unformatierten Code hin schicken und den formatierten Code zurück bekommen.

    Code könnte so ausschauen:

    PHP-Quellcode

    1. <?php
    2. $html = '<html lang="en"><head><title>Hello</title></head><body><div><p>Hello World!</p></div></body></html>';
    3. $dom = new DOMDocument("", "utf-8");
    4. $dom->preserveWhiteSpace = false;
    5. $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
    6. $dom->formatOutput = true;
    7. echo $dom->saveXML($dom->documentElement);


    Du kannst hier mal ausprobieren: xmgr.de/public/php/snippets/beautify-html

    Wenn du also ne Quasi-API bastelst, würdest du im PHP-Code das reinkommende HTML entsprechend aus einem POST Formular holen ($_POST["html_code"]) oder halt den raw request body (file_get_contents("php://input")) verwenden.


    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Link“ ()

    Ich las einmal »Chuck Norris kann HTML mit Regular Expressions parsen.« (Weniger schlecht programmieren, S. 269)
    Oder auch CodingHorror: Parsing Html The Cthulhu Way - ah, das ist ja sogar der gleiche Text wie von @EaranMaleasi
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Ich las einmal »Chuck Norris kann HTML mit Regular Expressions parsen.« (Weniger schlecht programmieren, S. 269)
    Oder auch CodingHorror: Parsing Html The Cthulhu Way - ah, das ist ja sogar der gleiche Text wie von @EaranMaleasi


    Ok, ich habe verstanden.

    Also, dann nehme ich RegEx, um den Source ein "bissl" besser als nur eine Byte-Wurst zu formatieren ... aber damit hat man längst keine performante IDE für HTML. Zumal ja elementerare Dinge, wie Syntax-Check oder Coloring in jedem Fall fehlen würden. Da muss man dann schon vernünftige Software einsetzen.

    Danke für eure zahlreichen Kommentare ... das hat mir dann doch gehofen, eine Sackgasse zu vermeiden. :)

    Der RegExTester von EDR ist sehr hübsch (auch wenn der Compile ein wenig meckert und ich offengestanden noch nicht alle Features so richtig verstehe). Danke 1

    LG
    Peter