Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于帮助仅计算字符串中的零的正则表达式_Java_Regex - Fatal编程技术网

Java 用于帮助仅计算字符串中的零的正则表达式

Java 用于帮助仅计算字符串中的零的正则表达式,java,regex,Java,Regex,我试图在一系列数字中计算0的数量。不仅仅是字符0,而是数字0。e、 g.我想数到0、0.0、0.000等。数字将用空格分隔,例如: 1.0 5.0 1 5.4 12 0.1 14.2675 0.0 0.00005 在字符串中简单搜索“0”几乎可以完成任务(我必须首先在字符串中插入一个前导空格,这样才能起作用-如果第一个数字是零)。但是,它不适用于0.x格式的数字,例如0.1,0.02等。我想我需要检查0,看看是否有小数点,然后是非零数字,但我不知道怎么做。比如: “0*(0\.(?!\\[1-

我试图在一系列数字中计算0的数量。不仅仅是字符0,而是数字0。e、 g.我想数到0、0.0、0.000等。数字将用空格分隔,例如:

1.0 5.0 1 5.4 12 0.1 14.2675 0.0 0.00005
在字符串中简单搜索
“0”
几乎可以完成任务(我必须首先在字符串中插入一个前导空格,这样才能起作用-如果第一个数字是零)。但是,它不适用于
0.x
格式的数字,例如
0.1
0.02
等。我想我需要检查
0
,看看是否有小数点,然后是非零数字,但我不知道怎么做。比如:

“0*(0\.(?!\\[1-9\\])”

有人知道我该如何做到这一点吗?最好使用正则表达式。如果更简单的话,我很乐意计算非零元素的数量。多谢各位


注意:我在Java中使用了
split
(使用正则表达式拆分字符串,然后使用
.length()
进行计数)

您应该改为按空格分割,并对每个片段使用Double.parseDouble(),如果它确实是一个Double,则将其与0进行比较

String[] parts = numbers.split("\\s+");
int numZeros = 0;
for (String s: parts) {
    try {
        if (Double.parseDouble(s) == 0) {
            numZeros ++;
        }
    } 
    catch (Exception e) {
    }
}

无论如何,正则表达式没有简单的解决方案。最简单的方法是使用\b边界运算符,但它失败得很严重。此外,Double.parseDouble表示也支持-0之类的内容。

您应该改为按空格分割,并在每个片段上使用Double.parseDouble(),如果它确实是一个Double,则将其与0进行比较

String[] parts = numbers.split("\\s+");
int numZeros = 0;
for (String s: parts) {
    try {
        if (Double.parseDouble(s) == 0) {
            numZeros ++;
        }
    } 
    catch (Exception e) {
    }
}
无论如何,正则表达式没有简单的解决方案。最简单的方法是使用\b边界运算符,但它失败得很严重。此外,Double.parseDouble意味着也支持-0之类的东西。

这样如何:

(?<=^|\s)[0.]+(?=\s|$)
(?这个怎么样:

(?<=^|\s)[0.]+(?=\s|$)
(?
split()
不是这个问题的解决方案,尽管它可以是解决方案的一部分,正如Antti的回答所示。您会发现在循环中将零值数字与
find()
匹配并计算匹配项要容易得多,如下所示:

String s = "1.0 5.0 1 5.4 12 0.1 14.2675 0.0 0.00005 0. .0 0000 -0.0";

Pattern p = Pattern.compile("(?<!\\S)-?(?:0+(?:\\.?0*)|\\.0+)(?!\\S)");
Matcher m = p.matcher(s);
int n = 0;

while (m.find()) {
    System.out.printf("%n%s ", m.group());
    n++;
}
System.out.printf("%n%n%d zeroes total%n", n);
这就是Tim在回答中使用正则表达式的意思(我想)。分解我的正则表达式,我们有:

  • (?)是一个负查找,它与前面没有非空白字符的位置相匹配。它相当于Tim的正查找,
    (?
    split()
    不是这个问题的解决方案,尽管它可以是解决方案的一部分,正如Antti的回答所示。您会发现在循环中将零值数字与
    find()
    匹配并计算匹配项要容易得多,如下所示:

    String s = "1.0 5.0 1 5.4 12 0.1 14.2675 0.0 0.00005 0. .0 0000 -0.0";
    
    Pattern p = Pattern.compile("(?<!\\S)-?(?:0+(?:\\.?0*)|\\.0+)(?!\\S)");
    Matcher m = p.matcher(s);
    int n = 0;
    
    while (m.find()) {
        System.out.printf("%n%s ", m.group());
        n++;
    }
    System.out.printf("%n%n%d zeroes total%n", n);
    
    这就是Tim在回答中使用正则表达式的意思(我想)。分解我的正则表达式,我们有:


    • (?是一个与前面没有非空白字符的位置相匹配的负数lookback。它相当于Tim的正数lookback,
      (?对正则表达式来说可能不是一个很好的应用程序,但您尝试过“(^ |\\s)([0.]+)(\\s |$)”?只对没有指数的格式良好的数字有效。我认为如果连续有两个零,
      split
      不会给你正确的答案。对于正则表达式来说,可能不是一个很好的应用程序,但是你试过“(^ s)([0.]+)(\\s |$)”?只适用于没有指数的格式良好的数字。如果一行有两个零,我认为
      split
      不会给您正确的答案。当然可以。如果输入的格式像这样不正确,那么正则表达式太简单了。然后使用
      -?0+(?:\.0+)
      而不是
      [0]+
      。对不起,你能解释一下你上次评论中的意思吗?Antti指的是什么情况?好吧,我原来的正则表达式也会将
      0.
      .0
      甚至
      视为零。我评论中的一个坚持以
      0
      开头,如果有小数点,则必须至少有一个e
      0
      在它之后。寓意:清楚地定义你想要匹配的内容和你不想要匹配的内容。我也可以使用更严格的版本,尽管我不希望我的输入有那么糟糕。我已经测试了你的解决方案,它工作得很好。谢谢你的帮助。当然可以。如果输入的格式像这样不正确,那么regex I太简单了。然后用
      -0+(?:\.0+)
      代替
      [0]+
      。对不起,你能解释一下你上次评论中的意思吗?Antti指的是什么情况?好吧,我原来的正则表达式也会将
      0.
      .0
      甚至
      视为零。我评论中的一个坚持以
      0
      开头,如果有小数点,则必须至少有一个e
      0
      在它之后。寓意:明确定义你想要匹配的内容和你不想要匹配的内容。我也可以使用更严格的版本,尽管我不希望我的输入有那么混乱。我已经测试了你的解决方案,它工作得很好。谢谢你的帮助。谢谢你的回答。为什么这比使用
      split更可取
      你介意我问吗?我可以在一行中计算零
      numberString.split((?谢谢你的回答。为什么这比使用
      split
      你介意我问吗?我可以在一行中计算零
      numberString.split(?