PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regex VS substring und ersten match exkludieren


josch
12.04.2009, 15:32
Hallo!!

Als erste würde ich gerne wissen ob substirng schneller ist als regex
(wovon ja schon fast auszugehen ist)
in meinem fall hab ich einen insgesamt 223 zeichen langen string der über
ein socket kommt und feste feldlängen hat.
Sprich in diesem string befinden sich mehrere Felder deren Länge fix ist.
Zwischen jedem Feld ist noch ein leerzeichen um sie visuell zu trennen.
der rest der felder die nicht voll ausgenutzt werden sind mit leerzeichen aufgefüllt.

Ich hatte das ganze über substring gelöst, finde aber regex wesentlich eleganter

Jetzt habe ich mir einen ausdruck geschrieben der mir diesen String in seine
einzelnen felder "explodet"

Funktioniert auch wunderbar, nur leider ist der erste Match der komplette
String selber.

Sprich ich bekomme als ersten match in meinem array den kompletten string
und dann folgen die einzelnen felder in den weiteren array slots.

Wie lässt sich das verhindern?

mein ausdruck sieht so aus

^(.{12}) (.{25}) (.{25}) (.{8}) (.{25}) (.{25}) (.{8}) (.{24}) (.{5}) (.{4}) (.{4}) .{45} (.{1})$

das ergebis sieht dann so aus:

array{
[0] = "Feld 1 Feld 2 Feld 3 Feld 4 Feld 5"
[1] = "Feld 1"
[2] = "Feld 2"
[3] .................
}

und ich würde gerne den inhalt von slot 0 komplett durch den regulären ausdruck verhindern.
Und eigentlich wollte ich jetzt nicht sowas machen wie einfach slot 0 entfernen bevor ich das
array zurückgebe ^^


Alamar
12.04.2009, 18:03
Ich nehme nun mal an, dass du php verwendest.

matches

Falls der Parameter matches angegeben wurde, wird er mit den Suchergebnissen gefüllt. $treffer[0] enthält dann den Text, der auf das komplette Suchmuster passt, $treffer[1] den Text, der auf das erste eingeklammerte Teilsuchmuster passt und so weiter.


Shifte einfach das erste Element, oder mach etwas entsprechendes, wie zb.

return array_slice(array,1);

josch
13.04.2009, 12:32
nein ich arbeite nict mit php, ich arbeite in java
und wie gesagt eigentlich hatte ich vor direkt mit dem regex den ersten match rauszufiltern,
um ein feld aus einem vector rauszubekommen gibts auch in java eine methode in der vector klasse
aber das wollte ich eigentlich vermeiden

Alamar
13.04.2009, 15:49
Dann erwaehne gleich welche Sprache du verwendest, weil das ist sowieso kein Regex Problem sondern ein Problem der Implementierung und ich vermutete PHP weil wie zitiert ist es da nunmal einfach so, dass der gesamte matchstring im errsten Array index ist. Du solltest Sprache(Inkl. version) und verwendete Klasse/Funktion nennen sonst kann man immer nur raten.

Verschieben nach Java bitte.

josch
13.04.2009, 15:58
naja bin davon ausgegangen das ich das erste result durch abändern des regex verhindern kann, deswegen habe ich es hierhingepostet.
Klar steht die regex parser engine fest, aber insofern es möglich ist durch den
regex den kompletten match zu ignorieren ist ein kein problem der implementierung
da jede regex engine vom prinzip her gleich arbeitet

Alamar
13.04.2009, 17:59
Regex engines arbeiten nicht alle gleich, es gibt zb. Thompsons Algorithmus fürs erstellen von NFA Simulationen der in linearer Zeit arbeitet weil er keine backreferences kann(=> kein backtracking macht) oder eben andere Algorithmen und Erweiterungen und irgendwo dazwischen dann eben auch PCRE(Was einige Sprachen verwenden).
Es ist eine Frage der Implementierung der Matching Methode was sie in den Array wirft. Wenn es wie bei PHP festgelegt ist, dass der Matching String als erster Index in den Array ge'push'ed wird, dann hast du keine andere Wahl.
=> API anschauen und die Beschreibung der Methode anschauen die du verwendest. Und da das alles mit Regex sowieso nichts zu tun hat => In das forum der konkreten Sprache.