質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

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

Q&A

解決済

3回答

1214閲覧

半角数字とハイフンとコンマ以外の入力を制限する方法

退会済みユーザー

退会済みユーザー

総合スコア0

正規表現

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

0グッド

0クリップ

投稿2023/01/23 12:51

前提

テキスト入力のフォーマットを作成するのにあたり、入力文字制限をしたい。

実現したいこと

半角数字とハイフンとコンマ以外の入力を制限したい。
半角数字と「-」の入力は必須だが「,」は入力がなくてもOK。
その他の記号および全角は入力NG。(入力文字制限は問わない)

▼具体例
半角数字で、「XXXXXXX-XXX-XXX」(ハイフン込み)の形式で
ご入力ください。
※複数ある場合は、「,(カンマ)」区切りですべてご入力ください。
例)1234567-001-001,3456789-001-001,5678901-001-001

試したこと

^[0-9]-[0-9]-[0-9]$

これだと1桁ずつしか指定できない。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yuma.inaura

2023/01/23 12:55

文字の繰り返し判定が分からない状態ならとりあえず「正規表現 連続」とかでググってみるとよいかも
shiketa

2023/01/23 12:56

> 半角数字とハイフンとコンマ以外の入力を制限したい。 ^[0-9\-,]*$ では?
退会済みユーザー

退会済みユーザー

2023/01/24 09:55

^[0-9\-,]*$ でいけそうですね。ありがとうございます。
guest

回答3

0

ヒットしたいフォーマットが7-3-3であればこんな感じで

/(^|,)(\d{7}(-\d{3}){2})+$/

投稿2023/01/25 00:30

yambejp

総合スコア114784

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

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

退会済みユーザー

退会済みユーザー

2023/01/25 03:00 編集

ありがとうございます。 /(^|,)(\d{7}(-\d{3}){2})+$/ では動きませんでしたが、 (^|,)(\d{7}(-\d{3}){2})+$ で動きましたが、{2}は2回までの繰り返しになる感じでしょうか? 今回は別の方法で採用しましたが、この方法でもいけそうなので参考にします。ありがとうございました。
guest

0

正規表現的解決法ではないのですが…

  1. 「,」で区切って配列化し、
  2. 配列の要素1つずつ確認して、
  3. 一つでも条件に満たないものがあればfalseを戻す。
  4. 全部条件を満たしていればtrueを戻す。

というのはいかがでしょうか?

javascript

1function validateNumbers(str) { 2 const numbers = str.split(','); // 「,」で分割して配列化 3 4 for (const n of numbers) { // 番号を1文ずつ確認 5 const isValid = /^\d{7}-\d{3}-\d{3}$/.test(n); // 「7桁 ハイフン 3桁 ハイフン 3桁」かどうか(true or false) 6 if (!isValid) return false; // falseだったらここで関数を終了し、falseを戻す 7 } 8 9 return true; // ↑の繰り返し処理が全部trueだったら、trueを戻す 10}; 11 12console.log(validateNumbers('1234567-001-001')); // true 13console.log(validateNumbers('12345-001-001')); // false 14console.log(validateNumbers('1234567-001-001,3456789-001-001,5678901-001-001')); // true 15console.log(validateNumbers('12345-001-001,3456789-001-001,5678901-001-001')); // false 16console.log(validateNumbers('1234567-001-001/3456789-001-001/5678901-001-001')); // false

正規表現のみで実装

javascript

1function validateNumbers(str) { 2 return /^\d{7}-\d{3}-\d{3}(,\d{7}-\d{3}-\d{3})*,*$/.test(str); 3}; 4 5console.log(validateNumbers('1234567-001-001,')); // true 6console.log(validateNumbers('12345-001-001')); // false 7console.log(validateNumbers('1234567-001-001,3456789-001-001,5678901-001-001')); // true 8console.log(validateNumbers('12345-001-001,3456789-001-001,5678901-001-001')); // false 9console.log(validateNumbers('1234567-001-001/3456789-001-001/5678901-001-001')); // false

投稿2023/01/23 15:44

編集2023/01/24 11:44
Cocode

総合スコア2314

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

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

退会済みユーザー

退会済みユーザー

2023/01/24 09:54

ありがとうございます。 機能として使えるのがシステムが正規表現のみなので、この方法ではできなさそうですね。 ご丁寧にありがとうございました。
Cocode

2023/01/24 11:44

正規表現のみでも実装してみました。回答を更新しましたのでご確認ください。
Cocode

2023/01/24 11:52

もしかして、HTMLタグの属性に書くパターンだったのでしょうか…質問の意図を間違って解釈していたかもしれませんすみません。
退会済みユーザー

退会済みユーザー

2023/01/25 02:52

私の質問の仕方悪かったかもしれないです。 /^\d{7}-\d{3}-\d{3}(,\d{7}-\d{3}-\d{3})*,*$/ では動きませんでしたが、 ^\d{7}-\d{3}-\d{3}(,\d{7}-\d{3}-\d{3})*,*$ で動きました!ありがとうございました!
guest

0

ベストアンサー

回答の方ではなく、コメントにいただいた
^[0-9-,]*$

の方法で解決しました。回答いただいた皆様ありがとうございました。
こちらも今後の参考にさせていただきます。

投稿2023/01/25 02:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問