我试图解决 leetcode 上的 Valid Number 问题。我为这个问题选择的语言是 Java。
如果您不想访问网站,这里是问题说明。
一个有效数字可以分成以下部分(按顺序):
十进制数或整数。
(可选)一个“e”或“E”,后跟一个整数。
一个十进制数可以被拆分成这些部分(按顺序):
(可选)一个符号字符(“+”或“-”)。
以下格式之一:
至少一位数字,后跟一个点“.”。
至少一位数字,后跟一个点“.”,后跟至少一位数字。
一个点“.”,后跟至少一位数字。
一个整数可以被拆分成这些组件(按顺序):
(可选)一个符号字符(“+”或“-”)。
至少一位。
例如,以下所有数字都是有效数字:
["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
以下不是有效数字:
["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给定一个字符串 s,如果 s
是一个有效数字,则返回 true。
我尝试将给定的字符串与以下正则表达式进行匹配。
<块引用>((\\+|-)?(\\d*\\.\\d+|\\d)[eE]?)
我在 Javascript 中分析了 RegExr 上的整个正则表达式。当我根据输入检查它时,它在 Javascript 中工作正常。我只是简单地转义转义字符 \
以使我的正则表达式在 Java 中工作。
Javascript 中的正则表达式 :- /\+|-?(\d*\.\d+|\d)[eE]?/g
以下是完整代码:-
class Solution {
public boolean isNumber(String s) {
String regex = "((\\+|-)?(\\d*\\.\\d+|\\d)[eE]?)";
return s.matches(regex);
}
}
但它给了我错误的答案。有人可以帮忙吗?
我想了解为什么这个正则表达式的 Java 版本不起作用?
我可以查看 leetcode 讨论部分来找到答案,但我想解释一下 Java 版本的正则表达式到底有什么问题。
答案 0 :(得分:3)
由于 3e+7
必须匹配,但在 [eE]
之后没有任何内容,您的正则表达式看起来是错误的。
以下正则表达式通过了所有给定的测试:
String regex = "^(\\+|\\-)?(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)([eE](\\+|\\-)?\\d+)?$";
我们可以理解为:
^
必须在开头匹配。(\\+|\\-)?
可能有 +
或 -
。( decimal1 | decimal2 | integer )
即数字点和可能更多的数字,可能数字点和数字,只有数字。( 10exponent )?
可能是指数,其中 10exponent
是 e
,后跟可能是符号和整数。$
仅此而已。答案 1 :(得分:1)
不要使用正则表达式来解决。尝试使用 Double#parseDouble
解析字符串,如果失败,则声明该字符串不代表数字。
演示:
public class Main {
public static void main(String[] args) {
String[] arr = { "2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93",
"-123.456e789", "abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53" };
for (String s : arr) {
try {
double n = Double.parseDouble(s);
System.out.println(s + " => " + n);
} catch (NumberFormatException | NullPointerException e) {
System.out.println(s + " is not a valid number.");
}
}
}
}
输出:
2 => 2.0
0089 => 89.0
-0.1 => -0.1
+3.14 => 3.14
4. => 4.0
-.9 => -0.9
2e10 => 2.0E10
-90E3 => -90000.0
3e+7 => 3.0E7
+6e-1 => 0.6
53.5e93 => 5.35E94
-123.456e789 => -Infinity
abc is not a valid number.
1a is not a valid number.
1e is not a valid number.
e3 is not a valid number.
99e2.5 is not a valid number.
--6 is not a valid number.
-+3 is not a valid number.
95a54e53 is not a valid number.
请注意,"NaN"
、"Infinity"
、"0xap0"
等也是有效数字。查看 Java Specification 以了解更多信息。