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シェルに貼り付けてパフォーマンスを検証できるスクリプトです。正規表現は、行の先頭と末尾にそれぞれ一致するように囲まれて^おり、末尾または先頭の文字が迷っていないかどうかを確認します。$

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 に答える