获取具有特定前缀 [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+
零个或多个非单词字符
(?:)
表示不捕获该组
给定像 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+
零个或多个非单词字符(?:)
表示不捕获该组