【问题标题】:JSON numbers Regular ExpressionJSON数字正则表达式
【发布时间】:2012-11-12 08:56:02
【问题描述】:

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

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

【问题讨论】:

  • 您可能应该解释一下“JSON 中的数字字符串”是什么意思,最好举个例子。 “JSON 数字”也有点令人费解。
  • 根据 json.org,由于空格,您的最后一个示例不应被视为数字。

标签: regex json


【解决方案1】:

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

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

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

【讨论】:

  • 能否请您或其他人向我解释一下您是如何得到答案的?
  • 我只是按照图表,从左到右。例如,首先您选择向下遇到-,或者直接跳过-。在正则表达式中,这可以表示为-?,或“零或一-s”。然后,路径再次分裂,在 0 和以 1 开头的一系列数字之间(以防止像 0123 这样的数字,因为 JSON 不支持八进制)。在正则表达式中,这可以用“交替”表示,如下所示:(?:xxx|yyy) 其中xxxyyy 是可能的“路径”。等等。如果您需要更深入地解释正则表达式,请告诉我们。
  • neg sign "-" 根据您的正则表达式,它本身就是一个有效的 json 数字。不会爆炸
  • @drgs - (?:0|[1-9]\d*) 保证至少有一个数字。如果您不想要,仍然不必敲打。
  • @kaizhu - 谢谢。嗯,你确定吗?那将只允许 2 位数(及更高)的数字...
【解决方案2】:

Andrew Cheonganswer 为基础,这是一个兼容 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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2015-11-16
      相关资源
      最近更新 更多