2017-01-31 3 views
0

Engine Name 470/485HP and some other text here about 100RPM or torqueのような文字列を指定して、HPの直前にある数字を抽出します。この例では、メソッドは485を返す必要があります。数値は整数であることが保証されています(心配するのは-123.45ではありません)。パターンdigitsHPは、文字列ごとに1回だけ表示されます。 1234-5678HPのようなケースが可能であり、5678が予想される結果です。私は、HPで終わるかどうかを確認する各部分文字列に対して、文字列をスペースで分割する方法を考え出しました。そうであれば、メソッドは最後のブロックを見つけて保存します。これを行う良い方法は何ですか?私はそれが正規表現の1ライナーかもしれないと思う。特定の接頭辞を持つ整数を取得する[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

使用 '\\ \\のD + Bを(キャプチャしないことを意味します?= HP \\ b) 'または[' \\ b(\\ d +)HP \\ b'](http://ideone.com/6im4kH)。 –

+0

なぜあなたは最初に 'split'を使うのですか?あなたの文字列に 'foo123hpbar'のようなデータが含まれている可能性はありますか?' 123hp'は無視されますか? – Pshemo

+0

はい、 'split()'は無礼なようです。おそらく、サンプルの入力が何らかの指示である場合は、少なくとも検索の速度を遅くする可能性があります。 – markspace

答えて

2

この方法...あなたの正規表現に

 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

私はそれをより一般的にしました: 'String matcherPattern ="([0-9] + "+ suffix +") "; パターンp = Pattern.compile(matcherPattern); ' 素晴らしい作品です、ありがとうございます。 – Stepan

+0

あなたは大歓迎です:) – TedTrippin

+0

OPにはサフィックスが含まれていません。この場合、 "\\ D(\\ d +)HP"が請求書に適合します。 または "\\ D(\\ d +)" +接尾辞 – WillD

3

使用をHPを追加します。

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; 
} 

ここで私は、この正規表現を使用している:(\d+)SUFFIX(?:$|\W+)

  • (\d+) - 手段ゼロO桁以上とキャプチャグループ1
  • $は、文字列の最後
  • \w+ゼロまたはそれ以上の非単語文字
  • (?:)このグループ
関連する問題