JSON编号正则表达式

时间:2012-11-12 08:56:03

标签: regex json

我正在尝试为JSON中的数字字符串编写正则表达式。我仍然是编写正则表达式的新手,我找到了JSON数字 here 的机器图,但我不确定如何攻击它。

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

3 个答案:

答案 0 :(得分:19)

供参考,这是http://www.json.org/fatfree.html的“数字”图表:

JSON number

应与此匹配的正则表达式是:

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

答案 1 :(得分:1)

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

var valueAsString = "55e-2";
var isANumber = !isNaN(valueAsString);

答案 2 :(得分:0)

Andrew Cheong的罚款answer为基础,此版本与 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