为什么正则表达式不能正常工作?

时间:2021-05-24 18:44:10

标签: java regex

我试图解决 leetcode 上的 Valid Number 问题。我为这个问题选择的语言是 Java。

如果您不想访问网站,这里是问题说明。

问题说明

一个有效数字可以分成以下部分(按顺序):

  1. 十进制数或整数。

  2. (可选)一个“e”或“E”,后跟一个整数。

一个十进制数可以被拆分成这些部分(按顺序):

  1. (可选)一个符号字符(“+”或“-”)。

  2. 以下格式之一:

    1. 至少一位数字,后跟一个点“.”。

    2. 至少一位数字,后跟一个点“.”,后跟至少一位数字。

    3. 一个点“.”,后跟至少一位数字。

一个整数可以被拆分成这些组件(按顺序):

  1. (可选)一个符号字符(“+”或“-”)。

  2. 至少一位。

例如,以下所有数字都是有效数字:

["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 版本的正则表达式到底有什么问题。

2 个答案:

答案 0 :(得分:3)

由于 3e+7 必须匹配,但在 [eE] 之后没有任何内容,您的正则表达式看起来是错误的。

以下正则表达式通过了所有给定的测试:

String regex = "^(\\+|\\-)?(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)([eE](\\+|\\-)?\\d+)?$";

我们可以理解为:

  • ^ 必须在开头匹配。
  • (\\+|\\-)? 可能有 +-
  • ( decimal1 | decimal2 | integer ) 即数字点和可能更多的数字,可能数字点和数字,只有数字。
  • ( 10exponent )? 可能是指数,其中 10exponente,后跟可能是符号和整数。
  • $ 仅此而已。

答案 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 以了解更多信息。