【问题标题】:How to substring this String如何子串这个字符串
【发布时间】:2019-10-22 14:48:06
【问题描述】:

我想得到这个字符串的 4 个部分

String string = "10 trillion 896 billion 45 million 56873";

我需要的 4 个部分是“10 万亿”“8960 亿”“4500 万”和“56873”。

我所做的是删除所有空格,然后将其子串化,但我对索引感到困惑。 我看到了很多问题,但无法理解我的问题。

Sorry I don't have any code

我不能跑,因为我不知道那是对的。

【问题讨论】:

  • 尝试正则表达式模式
  • “我所做的是删除所有空格,然后将其子串化” - 所以你确实有一些代码。请包含该代码,或至少一个 minimal reproducible example 来证明问题。
  • 听起来您需要正则表达式和模式匹配器 .find 方法进行分组,但抱歉我没有代码 ;)
  • 正确标记问题..这不是android相关问题
  • 我想是因为我是在android studio上做的

标签: java android substring


【解决方案1】:

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

String string = "10 trillion 896 billion 45 million 56873";
String[] array = string.split("(?<!\\G\\w+)\\s");

从本质上讲,我们是在每隔一个空间而不是在每个空间上进行拆分。

【讨论】:

  • 这个正则表达式是什么意思
【解决方案2】:

试试这个模式。

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

【讨论】:

    【解决方案3】:

    你可以使用这个正则表达式:

    \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());
    }
    

    【讨论】:

    • 请说出这个正则表达式是什么意思
    • 我已经添加了一个可视化它的图像,除了在正则表达式之后写的解释它的文本。你不明白哪些部分? @DemonAppProgrammer
    • 图片帮助我理解,谢谢
    • 我正在使我的编码正确,如果我得到想要的结果,我会接受这个答案
    【解决方案4】:

    正则表达式就是答案

    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亿

    第一组:8960 亿

    全场比赛:4500 万

    第 1 组:4500 万

    完整匹配:56873

    第 1 组:空

    【讨论】:

    • 请说出这个正则表达式是什么意思
    • @DemonAppProgrammer 检查这里regex means 和这个regexr.com
    • 它试图匹配 #number#space#word ,这基本上涵盖了你的输入字符串,剩下的部分由 \\d+ 匹配(匹配一个数字)。
    • 您可以在这里regex101.com 使用您的输入字符串尝试不同的正则表达式。它也具有自动代码生成功能。希望对您有所帮助!
    【解决方案5】:

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

    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() 函数
    • 我在正则表达式的第一个位置设置了“”(空格)。在我写完 [0-9] 之后。这意味着无论您从一堆值中获得“0到9之间任意数字的空间”的值。
    • 精神值之后你会从那里得到值。
    • 这意味着我需要先将空格(“”)替换为空(“”)?
    • 如果我有“3400 万 34879”(这不包括十亿和万亿)作为字符串,请帮忙。那么 part1 = 3400 万?
    【解决方案6】:

    试试下面的代码。

    公共静态 void main(String args[]) { String str = "10万亿8960亿4500万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;
    }
    

    【讨论】:

      【解决方案7】:

      下面的代码可以工作。检查 cmets 以获取更多说明。

      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));
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多