如何截取这个字符串

5
我想获取这个字符串的4个部分。
String string = "10 trillion 896 billion 45 million 56873";

我需要的四个部分分别为:"10万亿","8960亿","4500万"和"56873"。

我的做法是删除所有空格,然后使用子字符串,但是我对索引感到困惑。我看到了许多问题,但是无法理解我的问题。

Sorry I don't have any code

我无法运行,因为我不知道那是对的。


尝试正则表达式模式 - Faisal Naseer
我所做的是删除所有空格,然后对其进行子字符串操作。因此,您需要包括一些代码或至少一个[mcve]来演示问题。 - Jason
听起来你需要使用正则表达式和模式匹配器的 .find 方法与分组,但抱歉我没有代码 ;) - maslan
正确标记问题,这不是与Android相关的问题。 - Santanu Sur
我认为这是因为我在Android Studio上进行操作。 - Demon App Programmer
7个回答

5

您可以使用以下正则表达式:

\d+(?: (?:tri|bi|mi)llion)?

这个正则表达式首先匹配一堆数字 \d+,然后选择性地使用 (?:...)? 来匹配万亿、亿或百万 (?:tri|bi|mi)llion

进入图像描述

要使用这个正则表达式,

Matcher m = Pattern.compile("\\d+(?: (?:tri|bi|mi)llion)?").matcher(string);
while (m.find()) {
    System.out.println(m.group());
}

请告诉我这个正则表达式的含义。 - Demon App Programmer
1
我已添加了一个可视化图像,除了紧接着正则表达式解释的文本之外。您不理解哪些部分?@DemonAppProgrammer - Sweeper
那张图片帮助我理解了,谢谢。 - Demon App Programmer
我正在使我的代码正确,如果我得到了预期的结果,我会接受那个答案。 - Demon App Programmer

4

这是一种轻松获取解决方案的方法。

String filename = "10 trillion 896 billion 45 million 56873";
String regex = " [0-9]";
    
String[] values = filename.split(regex);
// You can get the value by position -> values[0] ... values[n]

// Use the Foreach loop to get all the values.
for(String subValue: values ){
    Log.i(TAG, "Part : "+subValue);
}

请解释一下这个正则表达式的含义?还有split()函数是什么意思? - Demon App Programmer
我已经将正则表达式中的“ ”(空格)设置在第一个位置。然后我写了[0-9]。这意味着无论从一堆值中获取到什么值,只要它是“以数字 0 到 9 开始的空格”,就会匹配成功。 - Prince Dholakiya
在精神价值之后,您将从那里获得价值。 - Prince Dholakiya
请帮忙,如果我有一个字符串"34 million 34879"(不包括十亿和万亿),那么part1 = 34 million是吗? - Demon App Programmer
是的,它会像您想的那样工作。“34百万34879”中的第一部分设置为“34百万”,第二部分设置为“34879”。 - Prince Dholakiya
显示剩余2条评论

2
以下代码可以使用。请查看注释以获取添加的说明。"Original Answer"翻译成"最初的回答"。
String input = "10 trillion 896 billion 45 million 56873";
        String pattern = "\\s\\d";     // this will match space and number thus will give you start of each number.
        ArrayList<Integer> inds = new ArrayList<Integer>();
        ArrayList<String> strs = new ArrayList<String>();
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(input);
        while (m.find()) {
            inds.add(m.start());          //start will return starting index.
        }

        //iterate over start indexes and each entry in inds array list will be the end index of substring. 
        //start index will be 0 and for subsequent iterations it will be end index + 1th position.
        int indx = 0;
        for(int i=0; i <= inds.size(); i++) {
            if(i < inds.size()) {
                strs.add(input.substring(indx, inds.get(i)));    
                indx = inds.get(i)+1;
            } else {
                strs.add(input.substring(indx, input.length()));
            }
        }

        for(int i =0; i < strs.size(); i++) {
            System.out.println(strs.get(i));
        }

1
正则表达式是答案。
import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(\\d+\\s+\\w+)|\\d+";
final String string = "10 trillion 896 billion 45 million 56873";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

它会打印:

完全匹配:10万亿

第1组:10万亿

完全匹配:8960亿

第1组:8960亿

完全匹配:4500万

第1组:4500万

完全匹配:56873

第1组:null

enter image description here


请告诉我这个正则表达式的含义。 - Demon App Programmer
1
@DemonAppProgrammer,请查看这里的正则表达式含义,以及这个网址 https://regexr.com/。 - AskNilesh
它尝试匹配 #number#space#word ,这基本上涵盖了您的输入字符串,剩下的部分由 \d+ 匹配(匹配数字)。 - ratish
你可以在 https://regex101.com/ 上尝试不同的正则表达式并输入字符串。它还有自动生成代码的功能。希望能对你有所帮助! - ratish

0

尝试使用这个模式。

([^\s]+\s+[^\s]+|[^\s]+)

enter image description here


0

尝试使用下面的代码。

public static void main(String args[]) { String str = "10万亿896亿45百万56873";

    String[] strlist = str.split(" ");

    for (int i = 0; i < strlist.length; i++) {
        String data=textNumber(strlist[i], (i+1<strlist.length?strlist[i + 1]:""));
        if (data != null) {
            System.out.println(data);
            i++;
        }
    }

}
public static String textNumber(String str1,String str2){

    if(str1.matches("[0-9]+")){
        if(str2.matches("[a-zA-Z]+")) {
            return  str1 + " " + str2;
        }
        return str1;
    }
     return null;
}

0
你可以使用以下正则表达式:
String string = "10 trillion 896 billion 45 million 56873";
String[] array = string.split("(?<!\\G\\w+)\\s");

基本上,我们是根据第二个空格而不是每个空格来分割的。


这个正则表达式是什么意思? - Demon App Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接