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

Get an integer with a certain prefix [Java]

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

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

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

使用这个方法:

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+ 零个或多个非单词字符
  • (?:)表示不捕获该组