2017-01-31 2 views
0

Gegeben Strings wie Engine Name 470/485HP and some other text here about 100RPM or torque und ich möchte eine Zahl direkt vor HP extrahieren. In dieser Beispielmethode sollte 485 zurückgegeben werden. Zahlen sind garantiert ganze Zahlen (keine -123.45 um sich Sorgen zu machen). Das Muster digitsHP erscheint nur einmal pro String. Fälle wie 1234-5678HP sind möglich und 5678 ist ein erwartetes Ergebnis. Ich habe eine Methode entwickelt, die Strings nach Leerzeichen aufteilt und für jeden Teilstring prüft, ob es mit HP endet. Wenn dies der Fall ist, findet die Methode den letzten Nummernblock und speichert ihn. Was ist ein besserer Weg, dies zu tun? Ich vermute, es könnte ein Regex-Einzeiler sein.Erhalte eine Ganzzahl mit einem bestimmten Präfix [Java]

public static void main(String[] args) { 

    String myStr = "Engine Name 470/485HP and some other text here about 100RPM or torque"; 
    List<Integer> list = parseIntegerWithSuffixIgnoreCase(myStr, "HP"); 
    System.out.println(list.get(0)); 
} 

public static List<Integer> parseIntegerWithSuffixIgnoreCase(String input, String suffix) { 
    List<Integer> result = new ArrayList<>(); 
    String[] rawStrings = input.split("\\s"); 

    for (String rawString : rawStrings) { 
     if (rawString.toUpperCase().endsWith(suffix)) { 

      Pattern p = Pattern.compile("[0-9]+"); 
      Matcher m = p.matcher(rawString); 
      List<String> allNumericMatches = new ArrayList<>(); 
      while (m.find()) { 
       allNumericMatches.add(m.group()); 
      } 
      Integer value = Integer.parseInt(allNumericMatches.get(allNumericMatches.size() - 1)); 
      result.add(value); 
     } 
    } 
    return result; 
} 
+2

Verwenden '\\ b \\ + d nicht erfassen (? = HP \\ b) 'oder [' \\ b (\\ d +) HP \\ b'] (http://ideone.com/6im4kH). –

+0

Warum haben Sie sich entschieden, 'split' zu verwenden? Ist es möglich, dass Ihr String Daten wie 'foo123hpbar' enthält? In diesem Fall sollte' 123hp' ignoriert werden? – Pshemo

+0

Ja, die 'split()' scheint im besten Fall unentgeltlich. Vermutlich wird es die Suche verlangsamen, zumindest wenn die Beispieleingabe ein Hinweis ist. – markspace

Antwort

2

HP auf Ihre regex Hinzufügen ...

 Pattern p = Pattern.compile("([0-9]+HP)"); 
     Matcher m = p.matcher("asdf 123HP 123"); 
     if (m.find()) 
      System.out.println("result - " + m.group(1)); 
+0

Ich machte es allgemeiner durch: 'String MatcherPattern =" ([0-9] + "+ Suffix +") "; Muster p = Pattern.compile (matcherPattern); ' Funktioniert gut, danke. – Stepan

+0

Sie sind willkommen :) – TedTrippin

+0

OP will nicht das Suffix enthalten. In diesem Fall "\\ D (\\ d +) HP" passt die Rechnung. Oder "\\ D (\\ d +)" + Suffix – WillD

3

Verwenden Sie diese Methode:

public static List<Integer> parseIntegerWithSuffixIgnoreCase(String input, String suffix) { 
    List<Integer> result = new ArrayList<>(); 
    Pattern pattern = Pattern.compile(String.format("(\\d+)%s(?:$|\\W+)", suffix)); 
    Matcher matcher = pattern.matcher(input); 
    while (matcher.find()) { 
     result.add(Integer.parseInt(matcher.group(1))); 
    } 
    return result; 
} 

Hier habe ich diese Regex verwendet haben: (\d+)SUFFIX(?:$|\W+)

  • (\d+) - Mittel zer o oder mehr digit und stellen Einfanggruppe 1
  • $ bedeutet Ende der Zeichenkette
  • \w+ Null oder mehr nicht Wortzeichen
  • (?:) bedeutet, diese Gruppe
Verwandte Themen