使用模式计算数字前的前导零的出现次数

时间:2017-08-09 19:44:11

标签: java regex

一个非常简单的问题。我需要在出现第一个数字之前得到尾随零的数量,即:

0000450 => 4
00632000670 => 2
77830 => 0

这是我已经尝试过的,感谢already answerd question

public static Integer trailingZeros(String s){
    Pattern patt = Pattern.compile("(0+)$");
    Matcher matcher = patt.matcher(String.valueOf(s));
    Integer trailingZeroes = 0;
    if (matcher.find()) {
        trailingZeroes = matcher.group(1).length();
    }
    return trailingZeroes;
}

3 个答案:

答案 0 :(得分:1)

问题:(0+)$这里意味着捕获一个或多个零,然后字符串结尾意味着它只会找到000000更多零的匹配,其他一切都不会匹配

  • (^0*)\\d*

    开始捕获^
    • 0 *:0
    • 出现零次或多次
  • \ d *:零个或多个数字
public static Integer trailingZeros(String s){
        Pattern patt = Pattern.compile("(^0*)\\d*");
        //                              ^   ^ group 1
        Matcher matcher = patt.matcher(String.valueOf("77830"));
        matcher.find()
    return matcher.group(1).length();
    //     simply return the length 
    // will return zero in case of no match found 
}

答案 1 :(得分:1)

如果您需要计算初始零,您甚至可以使用非正则表达式解决方案,如

public static int countInitialZeros(String haystack) {
    for (int i=0; i < haystack.length(); i++)
    {
        if (haystack.charAt(i) != '0') { // if current char is not 0
            return i;                    // return the index, it the count
        }
    }
    return haystack.length();          // If we get here, the whole string is made of zeros
}

请参阅online Java demo

测试:

System.out.println(countInitialZeros("0005606")); // => 3
System.out.println(countInitialZeros("005606"));  // => 2
System.out.println(countInitialZeros("05606"));   // => 1
System.out.println(countInitialZeros("5606"));    // => 0
System.out.println(countInitialZeros("0000"));    // => 4

注意:如果您确实需要确保字符串只包含数字,则可以在计算零之前使用s.matches("\\d+")

这是一种正则表达式方法,它确保字符串由数字组成并返回初始零的计数:

public static int countInitialZeros(String haystack) {
    return haystack.replaceFirst("^(0*)[1-9]\\d*$", "$1").length();
}

another demo^(0*)[1-9]\\d*$匹配

  • ^ - 字符串开头
  • (0*) - 第1组:零或更多0 s
  • [1-9] - 从19
  • 的数字
  • \\d* - 零个或多个数字
  • $ - 字符串的结尾。

如果你想为一个不仅包含你可能使用的数字的字符串返回一个-1

public static int countInitialZeros(String haystack) {
    return haystack.matches("\\d+") ? haystack.replaceFirst("^(0*)[1-9]\\d*$", "$1").length() : -1;
}

this Java democountInitialZeros("abc")会返回-1

答案 2 :(得分:0)

你可以简单地使用String::replaceFirst这个正则表达式^(0*).*,这意味着在开头的零之后替换所有内容:

String str = "0000450";
int nbr = str.replaceFirst("^(0*).*", "$1").length();

<强>输出

0000450          => 4
00632000670      => 2
77830            => 0