globe: Geschwindigkeitsproblem durch regulären Ausdruck?

Beitrag lesen

n'abend,

danke für Deine Anregungen. Ich habe es wie folgt formuliert:
final static Pattern regExp = Pattern.compile( "((\\S+).+?){2,2}((-{0,1}\\d+\\.\\d+).+?){3,4}(.*)" );

das {2,2} müsste man auch durch {2} repräsentieren können.

Wie komme ich nun an meine Daten? Das group-Array (oder was es ist) liefert mir nicht mehr alle Einträge.

Ich hab das mal kurz getestet. In der Tat führt die von mir vorgeschlagene Notation dazu, dass mit den CaptureGroups nicht mehr ordnungsgemäß (also so, wie ich das von anderen Sprachen gewohnt bin ;) arbeiten kann. »This just *must* be java«™.

Hier der Test:

import java.util.regex.MatchResult;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
  
public class RegExp  
{  
 public static void main( String[] args )  
 {  
  // Diese Notation scheint nur für stumpfes matchen brauchbar zu sein?!  
  //Pattern p = Pattern.compile( "((\\S+)\\s+){2}(\\s*(-?\\d+\\.\\d+)){3,4}" );  
  Pattern p = Pattern.compile( "(\\S+)\\s+(\\S+)\\s+(-?\\d+\\.\\d+)\\s+(-?\\d+\\.\\d+)\\s+(-?\\d+\\.\\d+)\\s*(-?\\d+\\.\\d+)?" );  
  
  
  String s = "300  3002401902   0.000 0.000  121.9840744655  0.0003" + "\n"  
    + "300  3002401903   0.000 0.000  129.9405567198";  
  
  Matcher m = p.matcher( s );  
  
  int c = 0;  
  while( m.find() )  
  {  
   // wo stehen wir denn?  
   System.out.println( "find() "+c+":" );  
   // was haben wir denn?  
   System.out.println( "group(): " + m.group() );  
   // wie viele gruppen haben wir?  
   System.out.println( "groupCount(): " + m.groupCount() );  
   // welche gruppen haben wir?  
   for( int i=0; i <= m.groupCount(); i++ )  
    System.out.println( "group("+i+"): " + m.group(i) );  
  
  
   System.out.println( "-----------------------------------------" );  
   c++;  
  }  
 }  
}  

Warum splittest du eigentlich nicht nach Spaces? Dadurch bekämst du ein String Array, mit welchem sich auch wunderbar weiterarbeiten ließe...

Eine Verständnisfrage habe ich auch: Warum muß ich am Ende ein (.*) anfügen? Das musste ich schon bei meinem "alten" Muster, damit es funktioniert. Meine Daten sehen zB so aus:

Ich tippe auf das LineFeed (das /(\r\n|\r|\n)/, welches die Zeile umbricht), oder auf die erzwungenen Spaces am Ende der letzten CaptureGroup.

Alle Werte:
300  3002401902   0.000 0.000  121.9840744655   0.0003

Ich sehe da Leerzeichen (respektive irgendwelche Spaces). Du solltest dein RegExp dahingehend anpassen, um den "." zu eliminieren. bspw. »((\S+)\s+){2,2}«, dann brauchst du auch das "ungreedy" (+?) nicht mehr. Ich weiss zwar nicht, ob das tatsächlich Auswirkungen auf die Performance hat, aber testen kannst du es ja mal.

* Sind die ersten beiden Werte immer Ganzzahlen? Warum scannst du dann nicht auch danach?
 * Floats müssen keinen Punkt haben. Der RegExp kann das berücksichtigen: ((-?\d+(\.\d+)?)\s+){3,4}

weiterhin schönen abend...

--
Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|