有没有一种方法可以在不知道确切索引的情况下找出字符串末尾有多少个数字?

wn9m85ua  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(360)

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

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

    return Integer.parseInt(sStr) - 1;
}

例子:
字符串:
“0分贝”$460澳元
子字符串:
460
我手动输入了子字符串的索引范围。但我想把它自动化。
我的方法:

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

这对于本例非常有效。
现在有一个问题,字符串末尾的数字也可以是4或5位数字。如果是这样的话,我自然会得到一个 NullPointerException .
有没有一种方法或其他方法来找出字符串末尾有多少个数字?

w51jfk4q

w51jfk4q1#

在您的情况下,我建议将regex与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
eaf3rand

eaf3rand2#

你可以用正则表达式, (?<=\D)\d+$ 表示一个或多个数字(即。 \d+ )从字符串末尾开始,前面是非数字(即。 \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;
    }
}
yc0p9oo0

yc0p9oo03#

如果我要这么做的话,我只会从头开始搜索。这是相当有效的。如果找不到正数,则返回-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));
kuuvgm7e

kuuvgm7e4#

如果只想获取最后一个数字,可以在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");
}

您必须添加

6l7fqoea

6l7fqoea5#

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

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

相关问题