在Java中使用正则表达式提取数字
在Java中,可以使用正则表达式来提取字符串中的数字,以下是几种常见的方法:
使用Pattern和Matcher提取所有数字
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractNumbers {
public static void main(String[] args) {
String text = "abc123def45ghi678";
// 正则表达式匹配一个或多个数字
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
List<String> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(matcher.group());
}
System.out.println("提取的数字: " + numbers); // 输出: [123, 45, 678]
}
}
提取数字并转换为整数
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractNumbersAsInt {
public static void main(String[] args) {
String text = "abc123def45ghi678";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
List<Integer> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(Integer.parseInt(matcher.group()));
}
System.out.println("提取的数字: " + numbers); // 输出: [123, 45, 678]
}
}
提取特定格式的数字
提取浮点数
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractDecimals {
public static void main(String[] args) {
String text = "Price: 19.99, Discount: 0.5, Total: 20.49";
// 匹配整数或小数
Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?");
Matcher matcher = pattern.matcher(text);
List<String> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(matcher.group());
}
System.out.println("提取的数字: " + numbers); // 输出: [19.99, 0.5, 20.49]
}
}
提取带千位分隔符的数字
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractFormattedNumbers {
public static void main(String[] args) {
String text = "Population: 1,234,567, Revenue: $987,654.32";
// 匹配带千位分隔符的数字
Pattern pattern = Pattern.compile("\\d{1,3}(,\\d{3})*(\\.\\d+)?");
Matcher matcher = pattern.matcher(text);
List<String> numbers = new ArrayList<>();
while (matcher.find()) {
// 移除千位分隔符
String num = matcher.group().replace(",", "");
numbers.add(num);
}
System.out.println("提取的数字: " + numbers); // 输出: [1234567, 987654.32]
}
}
使用String.split()方法
如果只需要简单的数字提取,可以使用split方法:
import java.util.Arrays;
public class ExtractWithSplit {
public static void main(String[] args) {
String text = "abc123def45ghi678";
// 用非数字字符分割字符串
String[] parts = text.split("\\D+");
// 过滤掉空字符串
Arrays.stream(parts)
.filter(s -> !s.isEmpty())
.forEach(System.out::println); // 输出: 123, 45, 678
}
}
常用正则表达式模式
| 需求 | 正则表达式 | 示例匹配 |
|---|---|---|
| 简单整数 | \d+ |
123, 4567 |
| 浮点数 | \d+(\.\d+)? |
123, 123.45 |
| 负数 | -?\d+ |
-123, 456 |
| 科学计数法 | [-+]?\d+(\.\d+)?[eE][-+]?\d+ |
23e-4, 5.67E+8 |
| 带千位分隔符的数字 | \d{1,3}(,\d{3})*(\.\d+)? |
1,234,567.89 |
| 电话号码 | \d{3}-\d{4} |
123-4567 |
选择哪种方法取决于你的具体需求,对于复杂的数字提取任务,使用Pattern和Matcher是最灵活的方法。
