如何将单词中间包含数字的字符串拆分为 java 中的字符串列表和整数列表?

how to split a string that contains number in middle of words into string lisit and int lisit in java?

我有 String data="5999999-log(1000)*100/1000-cbrt(log(10000^2))"。我想将数据字符串拆分为 int 列表 Int[] numbers = {5999999,1000,100,1000,10000,2} 这样我就可以将逗号分隔符添加到 int 列表中的每个数字,例如 5,999,999 到每个数字在 int 列表中,我不想要像 String[] s = {"-log(",")*","/","-cbrt(log(","^","))"} 这样的字符串,并且数据字符串是可编辑的,用户可以在其中编写表达式来求解,这样我就可以在运行时为每个数字组添加逗号。可能吗?我在 google 计算器

中看到的地方

您可以使用正则表达式 \d+(这意味着一个或多个数字的字符串)从给定的字符串中获取匹配的字符串,并将这些匹配的字符串中的每一个转换为 int 使用Integer#parseInt.

演示:

import java.util.Arrays;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String data = "5999999-log(1000)*100/1000-cbrt(log(10000^2))";
        int[] numbers = Pattern.compile("\d+")      // Pattern to match a string of one or more digits
                        .matcher(data)
                        .results()
                        .map(MatchResult::group)     // Map the MatchResult into String
                        .mapToInt(Integer::parseInt) // Map the String into int
                        .toArray();
        System.out.println(Arrays.toString(numbers));
    }
}

输出:

[5999999, 1000, 100, 1000, 10000, 2]

如果你想按照某种数字格式将每个 int 格式化为 String,你可以将加框的 IntStream(即 Stream<Integer>)映射到 Stream<String> 通过应用格式。

演示:

import java.text.NumberFormat;
import java.util.Arrays;
import java.util.Locale;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String data = "5999999-log(1000)*100/1000-cbrt(log(10000^2))";
        final NumberFormat formatter = NumberFormat.getNumberInstance(Locale.US);
        String[] formattedNumbers = Pattern.compile("\d+") // Pattern to match a string of one or more digits
                .matcher(data)
                .results()
                .map(MatchResult::group)                    // Map the each MatchResult into a String
                .mapToInt(Integer::parseInt)                // Map each String into an int
                .boxed()
                .map(number -> formatter.format(number))    // Format each int into a String using the formatter
                .toArray(String[]::new);                    // Convert Stream into array
        System.out.println(Arrays.toString(formattedNumbers));
    }
}

输出:

[5,999,999, 1,000, 100, 1,000, 10,000, 2]