Java 用于帮助仅计算字符串中的零的正则表达式
我试图在一系列数字中计算0的数量。不仅仅是字符0,而是数字0。e、 g.我想数到0、0.0、0.000等。数字将用空格分隔,例如: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-
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
开头,如果有小数点,则必须至少有一个e0
在它之后。寓意:清楚地定义你想要匹配的内容和你不想要匹配的内容。我也可以使用更严格的版本,尽管我不希望我的输入有那么糟糕。我已经测试了你的解决方案,它工作得很好。谢谢你的帮助。当然可以。如果输入的格式像这样不正确,那么regex I太简单了。然后用-0+(?:\.0+)
代替[0]+
。对不起,你能解释一下你上次评论中的意思吗?Antti指的是什么情况?好吧,我原来的正则表达式也会将
或0.
或.0
甚至…
视为零。我评论中的一个坚持以0
开头,如果有小数点,则必须至少有一个e0
在它之后。寓意:明确定义你想要匹配的内容和你不想要匹配的内容。我也可以使用更严格的版本,尽管我不希望我的输入有那么混乱。我已经测试了你的解决方案,它工作得很好。谢谢你的帮助。谢谢你的回答。为什么这比使用split更可取
你介意我问吗?我可以在一行中计算零numberString.split((?谢谢你的回答。为什么这比使用split
你介意我问吗?我可以在一行中计算零numberString.split(?