Ich versuche, Werte von Spalten einschließlich (!) Leerer Spalten aus mehreren CSV-ähnlichen einfachen Datenspaltenfolgen zu erfassen, die durch ein Semikolon getrennt sind. Und selbst wenn ich weiß, dass Regex nicht der beste Ansatz dafür ist und explizite CSV-Parser einen besseren Job machen würden, bleibt mir nichts anderes übrig, als PRCE Regex zu verwenden, um HTML-Tabellen <td>
Gruppen aus diesen Daten zu erstellen.Werte aus einer CSV-ähnlichen Zeichenfolge extrahieren, einschließlich leerer Felder mit PCRE-Regex
Das worsed Beispiel, das sollte (noch) Arbeit, sieht wie folgt aus:
;testvalue;"testvalue";"test "val"ue";test value;
... was wörtlich wie folgt interpretiert werden:
empty | testvalue | testvalue | test "val"ue | test value | empty
... die schließlich gerendert wird in diesen (nicht in Frage Teil):
<td>empty</td>
<td>testvalue</td>
<td>testvalue</td>
<td>test"val"ue</td>
<td>test value</td>
<td>empty</td>
(UPDATE wie von @anubhava gefragt)
Leider gibt es noch eine andere downer kommt mit: Das System, in dem es implementiert wird, hat eine feste Möglichkeit, die Strings zu behandeln. Es wird NUR erkannte Gruppen der Zeichenfolge erkennen und NUR ändern. Jeder andere nicht registrierte Teil der Zeichenkette wird direkt ausgedruckt mit dem Rest wie er ist. Das heißt: Wir müssen Register die Semikola in der Regex, auch wenn wir nicht wollen, dass sie ausgedruckt werden, sondern um sie durch Ignorieren ihrer übereinstimmenden Gruppe zu entfernen.
Normalerweise würde es ausreichen, nur die erfasste Gruppe auszudrucken, aber das funktioniert hier nicht. Um nur die Werte erfassen würde diese Ausgabe verursachen:
;;;;;
<td>empty</td>
<td>testvalue</td>
<td>testvalue</td>
<td>test"val"ue</td>
<td>test value</td>
<td>empty</td>
Vielleicht brauchen wir die gesamte Zeichenfolge zunächst in einer anderen Gruppe zu erfassen, oder wir müssen die Semikolons in einer anderen Gruppe erfassen, um sie später im Druck wegzuwerfen heraus? ...
ok, ich werde meine Frage aktualisieren, das Problem durch @ Stavr00 beschrieben zu ergreifen, mehrere Inline-Quotes berücksichtigen. – nilsun
Sry Ich musste die favorisierte Antwortflagge aus Saleems Antwort wieder entfernen, da es immer noch nicht die beste Lösung zu sein scheint. Danke für alle Bemühungen bis hier, aber es gibt Anzeichen dafür, dass der kürzere Ansatz weniger Ressourcen benötigt, da er weniger Schritte benötigt, auch wenn er noch nicht perfekt ist. Um ein Ersatzmuster zu erzeugen, müssen wir die Semikolons entfernen. Also brauchen wir 2 ((Capture) Gruppen), eine für den extrahierten Wert $ 1 und die andere 2 (;) $ 2 für den Müll. – nilsun