给定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;
}
答案 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));