获取带有特定前缀的整数[Java]

时间:2017-01-31 17:11:01

标签: java regex matcher

给定Engine Name 470/485HP and some other text here about 100RPM or torque之类的字符串,我想在HP之前提取一个数字。在此示例中,方法应返回485。数字保证为整数(无-123.45担心)。模式digitsHP每个字符串只出现一次。像1234-5678HP这样的案例是可能的,5678是预期的结果。我想出了一个方法,用空格分割字符串,为每个子字符串检查它是否以HP结尾。如果是,则method找到最后一个数字块并保存它。有什么更好的方法呢?我怀疑它可能是一个正则表达式的单行。

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 个答案:

答案 0 :(得分:3)

使用此方法:

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+) - 表示零或更多数字,并使捕获组1
  • $表示字符串结尾
  • \w+零个或多个非单词字符
  • (?:)表示不捕获此群组

答案 1 :(得分:2)

HP添加到您的正则表达式...

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