🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1249閲覧

javascript正規表現で1000以下(小数含む)をマッチしたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/03/11 08:48

編集2021/03/11 08:59

javascript正規表現で1000以下(小数含む)をマッチしたいです。
どなたかご教授お願いします。

以下ソースは試したことになります。

javascript

1 2// (OK) 3const param1 = 1000; 4const isChecked1 = param1.toString().match(/^(\d{1,3}|1{1}\d{3}|\d{1,3}.\d{1,4})$/); 5 6// (NG) isChecked2をtrueにしたいが、.0000はOKとしたい 7const param2 = 1000.0000; 8const isChecked2 = param2.toString().match(/^(\d{1,3}|1{1}\d{3}|\d{1,3}.\d{1,4})$/); 9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まぁあまり実務的では無いですけどね

javascript

1const reg=/^(([1-9]\d{1,2}|0)(.\d+)|1000)?$/; 2 3const param1 = 1000; 4const isChecked1 = reg.test(param1.toString()); 5console.log(isChecked1); 6 7const param2 = 1000.0001; 8const isChecked2 = reg.test(param2.toString()); 9console.log(isChecked2); 10 11const param3 = 999.999; 12const isChecked3 = reg.test(param3.toString()); 13console.log(isChecked3);

投稿2021/03/11 09:01

編集2021/03/11 09:01
yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/11 09:05 編集

コメントありがとうございます。 いい感じの正規表現でしたが、1000.0000の場合、判定できないみたいです。 1000.0000の判定自体が実務的でないかもしれません。
yambejp

2021/03/11 09:15

?? 1000.0000ってtoString()すると1000じゃないですか?
退会済みユーザー

退会済みユーザー

2021/03/11 09:17

toString()が使えるのを忘れていました。 ありがとうございます!
yambejp

2021/03/11 09:21

「実務的では無い」と書いた理由は、そもそもが元は数値なんだから n<=1000という判定で十分ということ。 数値を文字列にキャストして正規表現にする場合は数値は数値として 一度評価されるべきです。 そういう意味で、 const param1 = 1e3; としてもtrueになります
think49

2021/03/11 09:53 編集

> const reg=/^(([1-9]\d{1,2}|0)(.\d+)|1000)?$/; 「1.1」「99」にマッチせず、空文字にマッチする正規表現になっていませんか。
yambejp

2021/03/11 09:57 編集

あ、しまった const reg=/^(([1-9]\d{0,2}|0)(.\d+)?|1000)$/;
think49

2021/03/11 09:56

ですね。 後は空文字に非マッチ、整数にマッチさせれば良いと思います。
think49

2021/03/11 10:03 編集

「1000以下(小数含む)」が条件なら、負の数(整数&小数)も含まれるかもしれませんが…。
yambejp

2021/03/11 10:01

そう言われてみれば、たしかに・・・
退会済みユーザー

退会済みユーザー

2021/03/11 23:20 編集

ご返信遅くなり申し訳ありません。 yambejpさんの const reg=/^(([1-9]\d{0,2}|0)(.\d+)?|1000)$/; がベストアンサーですね、ありがとうございます。 ^(\d{1,3}|1000|\d{1,3}.\d*|1000.0*)$ にしようかと思ってましたが、 ^(([1-9]\d{0,2}|0)(.\d+)?|1000)$ のほうがよくまとまっていますね!
退会済みユーザー

退会済みユーザー

2021/03/12 02:26 編集

自作Validationを作成していたのですが、 toString()を使用しましたがうまくいかなかったので、一度Number()をすることにしました。 ただし、1000.00だったら1000に変える処理をしてから実行したほうが良いかもしれません。 // 実際に作成したコード if (param != null) { const isChecked = param.match(/\d*/); if (!isChecked) { errorMessages.push("数字で入力してください。"); return; } const number = Number(param); // 100以下 or 小数点 or 1000以下 const isChecked2 = number.match(/^(([1-9]\d{0,2}|0)(.\d+)?|1000)$/); if (!isChecked2) { errorMessages.push("数字は1000以内で入力してください。"); } }
yambejp

2021/03/12 02:36 編集

validationというからにはparamはユーザーの入力を チェックしようとしていますか? 途中で補足したとおり数値の判断は不等号で十分です <input type="text"> <script> document.querySelector('input').addEventListener('input',e=>{ const v=e.target.value; const flg=!isNaN(v) && v<=1000; console.log(flg); }); </script>
退会済みユーザー

退会済みユーザー

2021/03/12 03:18 編集

isNaNで判定する方法もあるのですね、不等号で十分という点についても 気付かなかったので試してみたいと思います。 そもそも、数値の判定に正規表現がいらないんですね if (param != null) { if (isNaN(param) || param > 1000) { errorMessages.push("数字は1000以内で入力してください。"); } } データ型の関係で動かない場合はあるかもしれません。 yambejpさんの回答がやっと理解できました。 ありがとうございます。
guest

0

最終的に解決した方法。自作validationの数値のチェックに正規表現を使わないようにした。

必須チェックは別にしているので、if (param != null) でnullを無視してます。

javascirpt

1if (param != null) { 2 if (isNaN(param) || param > 1000) { 3 errorMessages.push("数字は1000以内で入力してください。"); 4 } 5}

投稿2021/03/11 09:11

編集2021/03/12 03:22
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2021/03/11 10:21 編集

> 教えて頂いた方法を参考に ^(\d{1,3}|1000|\d{1,3}.\d*|1000.0*)$ にて対応しました。 「001」「1000.」が許容範囲なら、「00000001」「01000」「.1」値も許容範囲でいいような。 負の数は範囲外なんですね。
退会済みユーザー

退会済みユーザー

2021/03/15 01:54

コメントありがとうございます。 負数を範囲外ということを記載していなくすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問