杰瑞科技汇

Java正则如何精准提取数字?

在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是最灵活的方法。

分享:
扫描分享到社交APP
上一篇
下一篇