从字符串中提取数字的Java方法
在Java中,有几种方法可以从字符串中提取数字,以下是几种常用的实现方式:
使用正则表达式
这是最灵活和强大的方法:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractNumbers {
public static List<Integer> extractNumbers(String str) {
List<Integer> numbers = new ArrayList<>();
Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
numbers.add(Integer.parseInt(matcher.group()));
}
return numbers;
}
public static void main(String[] args) {
String input = "abc123def45gh6";
List<Integer> numbers = extractNumbers(input);
System.out.println(numbers); // 输出: [123, 45, 6]
}
}
使用Java 8 Stream API
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class ExtractNumbersStream {
public static List<Integer> extractNumbers(String str) {
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
return matcher.results()
.map(m -> Integer.parseInt(m.group()))
.collect(Collectors.toList());
}
public static void main(String[] args) {
String input = "abc123def45gh6";
List<Integer> numbers = extractNumbers(input);
System.out.println(numbers); // 输出: [123, 45, 6]
}
}
手动遍历字符串
如果不使用正则表达式,可以手动遍历字符串:
import java.util.ArrayList;
import java.util.List;
public class ExtractNumbersManual {
public static List<Integer> extractNumbers(String str) {
List<Integer> numbers = new ArrayList<>();
StringBuilder currentNumber = new StringBuilder();
for (char c : str.toCharArray()) {
if (Character.isDigit(c)) {
currentNumber.append(c);
} else if (currentNumber.length() > 0) {
numbers.add(Integer.parseInt(currentNumber.toString()));
currentNumber.setLength(0);
}
}
// 添加最后一个数字(如果字符串以数字结尾)
if (currentNumber.length() > 0) {
numbers.add(Integer.parseInt(currentNumber.toString()));
}
return numbers;
}
public static void main(String[] args) {
String input = "abc123def45gh6";
List<Integer> numbers = extractNumbers(input);
System.out.println(numbers); // 输出: [123, 45, 6]
}
}
提取浮点数
如果需要提取浮点数,可以修改正则表达式:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractFloats {
public static List<Double> extractFloats(String str) {
List<Double> numbers = new ArrayList<>();
Pattern pattern = Pattern.compile("\\d+\\.\\d+"); // 匹配浮点数
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
numbers.add(Double.parseDouble(matcher.group()));
}
return numbers;
}
public static void main(String[] args) {
String input = "abc123.45def6.78gh9";
List<Double> numbers = extractFloats(input);
System.out.println(numbers); // 输出: [123.45, 6.78]
}
}
注意事项
- 正则表达式
\\d+匹配一个或多个数字字符 - 如果字符串中包含负数,可以使用
"-?\\d+"作为正则表达式 - 对于非常大的数字,可能需要使用
Long或BigInteger而不是Integer - 如果字符串格式复杂,可能需要更复杂的正则表达式
选择哪种方法取决于你的具体需求和性能考虑,正则表达式通常是最简洁和灵活的解决方案。
