我正在尝试为 JSON 中的数字字符串编写正则表达式。我对编写正则表达式还是新手,我在这里找到了一个 JSON 数字的机器图,但我不知道如何攻击它。
以下是正则表达式应该找到的一些字符串。"22", "55.75466", "-44.565" "55e-2" "69234.2423432 E78" 任何帮助表示赞赏!
作为参考,这是来自http://www.json.org/fatfree.html的“数字”图:
应该匹配的正则表达式是:
-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?
基于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
acheong87 的答案应该提供您需要的正则表达式。但是,如果您只是想检查通过 JSON 返回的字符串是否“是一个数字”,那么您可以这样做:
var valueAsString = "55e-2";
var isANumber = !isNaN(valueAsString);