【问题标题】:Is there a way to find out how many numbers are at the end of a string without knowing the exact index?有没有办法在不知道确切索引的情况下找出字符串末尾有多少个数字?
【发布时间】:2021-03-26 06:16:04
【问题描述】:

我有一个从字符串中提取某个子字符串的方法。该子字符串由字符串中的数字组成。然后将其解析为整数。

方法:

protected int startIndex() throws Exception {
    String str = getWorkBook().getDefinedName("XYZ");
    String sStr = str.substring(10,13);

    return Integer.parseInt(sStr) - 1;
}

例子:

字符串:

'0 DB'!$B$460

子字符串:

460

好吧,我手动输入了子字符串的索引范围。但我想自动化它。

我的做法:

String str = getWorkBook().getDefinedName("XYZ");
int length = str.length();
String sStr = str.substring(length - 3, length);

这适用于本示例。

现在有个问题,字符串末尾的数字也可以是4位或5位。如果是这样,我自然会得到NullPointerException

有没有办法找出字符串末尾有多少个数字?

【问题讨论】:

    标签: java string substring


    【解决方案1】:

    如果我要这样做,我只会从头开始搜索。这是相当有效的。如果没有找到正数,则返回 -1。也可以使用其他返回选项和使用OptionalInt

    String s = "'0 DB'!$B$460";
    int i;
    for (i = s.length(); i > 0 && Character.isDigit(s.charAt(i-1)); i--);
    int vv = (i < s.length()) ? Integer.valueOf(s.substring(i)) : -1;
    System.out.println(vv);
    

    打印

    460
    

    如果您知道末尾总会有一个数字,您可以忘记上面的三进制 (?:),只需执行以下操作:

    int vv = Integer.valueOf(s.substring(i));
    

    【讨论】:

      【解决方案2】:

      无需正则表达式的简单快速解决方案:

      public class Main
      {
          public static int getLastNumber(String str) {
              int index = str.length() - 1;
              while (index > 0 && Character.isDigit(str.charAt(index)))
                  index--;
                  
              return Integer.parseInt(str.substring(index + 1));        
          }
          
          public static void main(String[] args) {
              final String text = "'0 DB'!$B$460";
              System.out.println(getLastNumber(text));
          }
      }
      

      输出将是:

      460
      

      【讨论】:

        【解决方案3】:

        如果只想获取最后一个数字,可以在revert时遍历整个字符串并获取起始索引:

        protected static int startIndex() {
            String str = getWorkBook().getDefinedName("XYZ");
        
            if(Character.isDigit(str.charAt(str.length() - 1))) {
                for(int i = str.length() - 1; i >= 0; i--){
                    if(!Character.isDigit(str.charAt(i)))
                        return i+1;
                }
            }
            return -1;
        }
        

        然后打印出来:

        public static void main(String[] args)  {
            int start = startIndex();
            if(start != -1)
               System.out.println(getWorkBook().getDefinedName("XYZ").substring(start));
           else 
              System.out.println("No Number found");
        }
        

        你必须添加

        【讨论】:

          【解决方案4】:

          在您的情况下,我建议像这样将正则表达式与 replaceAll 一起使用:

          String sStr = str.replaceAll(".*?([0-9]+)$", "$1");
          

          这将提取最后的所有数字或您的字符串或任何长度。

          另外我认为你错过了字符串中没有数字的情况,因为我建议在将字符串转换为整数之前检查你的字符串。

          String sStr = str.replaceAll(".*?([0-9]+)$", "$1");
          if (!sStr.isEmpty()) {
              return Integer.parseInt(sStr) - 1;    
          }
          return 0; // or any default value
          

          【讨论】:

          • regex 是的,但是 replaceAll 可能会在搜索字符串上多次应用正则表达式(如果存在多个(块)数字,最后所有数字将合并到一个大数字块中。
          • @Robert 老实说我不明白你,你能举个例子解释一下吗!
          • 查看问题中的示例输入'0 DB'!$B$460。您的代码返回 0460 而不是 460。在这种情况下,因为第一个数字是 0,解析后的数字将是相同的,但如果有一个不等于 0 的数字,您的代码就会失败。
          • @Robert 正确,我错过了在正则表达式 .*?([0-9]+)$ 中添加 $,修复它。
          • 所以这工作正常。感谢您采用这种新方法。
          【解决方案5】:

          您可以使用正则表达式(?&lt;=\D)\d+$,它表示字符串末尾的一个或多个数字(即\d+),preceded by 非数字(即\D)。

          import java.util.regex.Matcher;
          import java.util.regex.Pattern;
          
          public class Main {
              public static void main(String[] args) {
                  // Test
                  System.out.println(getNumber("'0 DB'!$B$460"));
              }
          
              static String getNumber(String str) {
                  Matcher matcher = Pattern.compile("(?<=\\D)\\d+$").matcher(str);
                  if (matcher.find()) {
                      return matcher.group();
                  }
          
                  // If no match is found, return the string itself
                  return str;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2022-01-28
            • 2012-01-18
            • 1970-01-01
            • 2015-09-25
            • 1970-01-01
            • 1970-01-01
            • 2021-04-26
            • 2019-09-30
            • 2022-01-04
            相关资源
            最近更新 更多