Zum Inhalt springen

Textextraktion (PEG statt Regex)

Bei Browserautomatisierung treffen Sie häufig auf unordentliche Daten: uneinheitlich formatierte Texte, Tippfehler oder mehrere Informationsarten in einer einzigen Zeichenkette.

JavaScript und Lua verwenden dafür meist reguläre Ausdrücke. Guida enthält zusätzlich die Janet-Engine mit eingebauter Parsing Expression Grammar (PEG). PEGs sind eine lesbare und wartbare Alternative, wenn Textstrukturen komplexer werden.

Regex ist hervorragend für einfache Muster. Bei verschachtelten oder wechselhaften Strukturen wird es schnell schwer lesbar.

Nehmen wir eine Zeichenkette wie "Item: SuperWidget (ID: 98765) - Only $49.99 today!".

const text = "Item: SuperWidget (ID: 98765) - Only $49.99 today!";
const regex = /\\(ID:\\s*(\\d+)\\).*?\\$([0-9.]+)/;
const match = text.match(regex);
if (match) {
const id = match[1];
const price = match[2];
g.log(`Found ID: ${id}, Price: ${price}`);
}

Das funktioniert, ist aber spröde. Kleine Formatänderungen können das Muster brechen, und spätere Anpassungen sind oft schwer nachzuvollziehen.

Janets peg-Modul erlaubt zusammensetzbare Parser. Statt einer kryptischen Zeichenkette definieren Sie eine Grammatik aus benannten Regeln.

(def text "Item: SuperWidget (ID: 98765) - Only $49.99 today!")
(def product-grammar
(peg/compile
~{:id-rule (sequence "(ID: " (capture (some :d)) ")")
:price-rule (sequence "$" (capture (some (choice :d "."))))
:main (any (choice
:id-rule
:price-rule
1))}))
(def results (peg/match product-grammar text))
(if results
(do
(def id (get results 0))
(def price (get results 1))
(g.log (string "Found ID: " id ", Price: " price))))
  1. Lesbarkeit: Regeln haben Namen und können aufeinander verweisen.
  2. Zusammensetzung: Komplexe Parser entstehen aus kleineren, getesteten Regeln.
  3. Vorhersagbarkeit: PEGs passen genau auf die angegebenen Regeln und vermeiden viele unklare Backtracking-Fälle.
  4. Datenstrukturen: Janets peg-Modul kann Arrays und Dictionaries direkt aus dem Parse-Schritt erzeugen.
  • JavaScript oder Lua mit Regex eignet sich für einfache Validierungen, etwa ob ein Text wie eine E-Mail-Adresse aussieht.
  • Janet mit PEG eignet sich, wenn mehrere zusammenhängende Werte aus wechselhaften Textblöcken extrahiert werden müssen.