13

我正在尝试为 JSON 中的数字字符串编写正则表达式。我对编写正则表达式还是新手,我在这里找到了一个 JSON 数字的机器图,但我不知道如何攻击它。

以下是正则表达式应该找到的一些字符串。"22", "55.75466", "-44.565" "55e-2" "69234.2423432 E78" 任何帮助表示赞赏!

4

3 回答 3

24

作为参考,这是来自http://www.json.org/fatfree.html的“数字”图:

JSON 编号

应该匹配的正则表达式是:

-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?
于 2012-11-12T09:04:35.393 回答
1

基于Andrew Cheong的好答案,这里有一个兼容Bash的版本。细微的差异需要一段时间才能变得恰到好处。

-?(0|[1-9][[:digit:]]*)(\.[[:digit:]]+)?([eE][+-]?[[:digit:]]+)?

最后,差异只是替换子句中的\d替换[[:digit:]]?:删除。

这是一个脚本,您可以将其粘贴到 Bash shell 中以验证其性能。正则表达式被包围^$分别匹配行的开始和结束,以检查杂散的尾随或前导字符。

while read line; do
    if [[ $line =~ ^-?(0|[1-9][[:digit:]]*)(\.[[:digit:]]+)?([eE][+-]?[[:digit:]]+)?$ ]]
    then
        echo "$line is a number"
    else 
        echo "$line NOT a number"
    fi
done << END
1
-1
a
1a
a1
-1.0
1.
.0
.
-.0
+
+0
+.0
22
55.75466
-44.565
55e-2
69234.2423432 E78
69234.2423432E78
-
0123
END

在 Bash 4.4.12 中,我得到:

1 is a number
-1 is a number
a NOT a number
1a NOT a number
a1 NOT a number
-1.0 is a number
1. NOT a number
.0 NOT a number
. NOT a number
-.0 NOT a number
+ NOT a number
+0 NOT a number
+.0 NOT a number
22 is a number
55.75466 is a number
-44.565 is a number
55e-2 is a number
69234.2423432 E78 NOT a number
69234.2423432E78 is a number
- NOT a number
0123 NOT a number
于 2019-10-29T02:09:13.270 回答
0

acheong87 的答案应该提供您需要的正则表达式。但是,如果您只是想检查通过 JSON 返回的字符串是否“是一个数字”,那么您可以这样做:

var valueAsString = "55e-2";
var isANumber = !isNaN(valueAsString);
于 2012-11-12T09:18:56.027 回答