2013-03-25 15 views
7

bekannt ist, ich brauche die erste ganze Zahl in einem nicht sicher java.lang.String und ist gefunden zu extrahieren, ob zu versuchen und einen substring Ansatz oder einen regulären Ausdruck Ansatz zu verwenden:Leistungsvergleich zwischen Substring vs RegEx wenn Startindex

// Want to extract the 510 into an int. 
String extract = "PowerFactor510"; 

// Either: 
int num = Integer.valueof(extract.substring(???)); 

// Or a regex solution, something like: 
String regex = "\\d+"; 
Matcher matcher = new Matcher(regex); 
int num = matcher.find(extract); 

Also frage ich:

  • Welche Art von Lösung ist hier besser geeignet, und warum ?; und
  • Wenn der Teilstring Ansatz geeigneter ist, was könnte ich verwenden, um den Anfang einer Zahl anzuzeigen?
  • Sonst, wenn die Regex die geeignete Lösung ist, was ist die Regex/Muster/Matcher/Methode, die ich verwenden sollte, um die Zahl zu extrahieren?

Hinweis: Der String wird immer mit dem Wort PowerFactor durch eine nicht negative ganze Zahl gefolgt beginnen. Danke im Voraus!

+1

Regex wäre aufgrund der schnelleren Verarbeitung ratsam. –

+3

Ist Regex wirklich schneller als 'substring (11)'? Der erste Teil ist immer fest ... Ich glaube nicht, dass das Parsen einer Regex, das Durchlaufen der Zeichenkette und das Extrahieren der entsprechenden Gruppe schneller wäre, als nur die ersten 11 Zeichen abzutrennen ... – ppeterka

+0

http: // docs. oracle.com/javase/6/docs/api/java/lang/String.html#substring (null) – Kent

Antwort

10

Der String wird mit dem Wort „Powerfactor“ von einer nicht negativen ganzen Zahl

gefolgt immer beginnt Dies bedeutet, dass Sie genau wissen, in welchem ​​Index die Nummer zu finden, würde ich Ihnen sagen, besser Verwenden Sie den Teilstring direkt, zumindest in Anbetracht der Leistung wäre es viel schneller als Suchen und Anpassen von Arbeit.

extract.substring("PowerFactor".length()); 

Ich konnte keine direkten Vergleich finden, aber Sie können über jeden der beiden Optionen lauten:

1

War ein bisschen neugierig und versucht, die folgende

String extract = "PowerFactor510"; 
long l = System.currentTimeMillis(); 
System.out.println(extract.replaceAll("\\D", "")); 
System.out.println(System.currentTimeMillis() - l); 

System.out.println(); 

l = System.currentTimeMillis(); 
System.out.println(extract.substring("PowerFactor".length())); 
System.out.println(System.currentTimeMillis() - l); 

Und es stellte sich heraus, dass der zweite Test viel schneller war, so dass substring gewinnt.

+0

Warum in der Welt würden Sie '\ D' in Klammern setzen? – tchrist

+0

@tchrist Editierte die Antwort – tmwanik

+2

Das ist ein schrecklicher Test. Die replaceAll-Methode der String-Klasse führt vor der Verarbeitung eine Inline-Kompilierung für die RegEx durch. Die Methode liefert keinen geeigneten Test gegen Pattern/Matcher oder irgendetwas RegEx bezogen. Geschwindigkeitsdifferenzen, die Sie sehen, hängen mit der Objektgenerierung und dem GC in der JVM zusammen. – ingyhere

Verwandte Themen