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