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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

正規表現

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

5211閲覧

「全角か、半角カナ」が1つでもあったらfalseを返したい

nikuatsu

総合スコア177

JavaScript

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

正規表現

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2021/12/10 10:50

編集2021/12/10 12:19

実現したいこと

JavaScriptで「全角か、半角カナ」が1つでもあったらfalseを返したいです。
(パスワード入力フォームで、falseならエラーを返したいためです。)

ソースコード案

いろいろ試してはいるものの、どれもぴったりハマりません。

js

1// 判定の例 2var str = "a4fあ%g"; // -> 「あ」があるので false 3var str = "fyhtsw0"; // -> 「t」があるので false 4var str = "5Abgカ"; // -> 「A」「カ」があるので false 5var str = ")HS0g8"; // -> true 6var str = "408458"; // -> true 7var str = "ARHYA"; // -> true 8 9function isZenkaku(str) { 10 if ( str.match(/[A-Za-z0-9-!”#$%&’()=<>,.?_[]{}@^~¥]/g) ) { 11 return true 12 } else { 13 return false; 14 } 15} 16 17function isZenkaku(str){ 18 if ( str.match(/^[^\x01-\x7E\xA1-\xDF]+$/) ) { 19 return true; 20 } else { 21 return false; 22 } 23} 24 25function isZenkaku(str) { 26 if ( String(str).match(/[\x01-\x7E\uFF65-\uFF9F]/) ) { 27 return true; 28 } else { 29 return false; 30 } 31}

(追記:当初は「全角」だけを対象とした意図で上記を試しておりましたが、「半角カナ」も対象でした。)

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

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

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

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

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

guest

回答5

0

(パスワード入力フォームで、falseならエラーを返したいためです。)

この要件を見過ごしていました。

それならまず「パスワードに使える文字セット」を限定した上で、入力文字列をバリデーションするのが普通だと思います。

たとえばシンプルに「半角のアルファベット、数字」に限定するなら [a-zA-Z0-9]+ でいいでしょう。

投稿2021/12/10 12:34

itagagaki

総合スコア8402

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

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

nikuatsu

2021/12/10 12:43

なるほど、方向が逆だったのですね!言われてみればその方が適切な処理だと思います。 限定は「半角のアルファベット、数字、記号」なので、こうでしょうか? function isOkPassStr(str) { if ( str.match(/[a-zA-Z0-9!"#$%&'()*+\-.,/:;<=>?@[\]^_`{|}~]+/g) ) { return true; } else { return false; } } 違いましたね…。「記号」をご提示の正規表現に続けて書いたのですが、これでは何がいけませんでしょうか?
itagagaki

2021/12/10 13:13 編集

それだと、strの中にそのパターンにマッチする部分が1部分でもあればtrueになってしまいます。 なのでパターンの最初に ^ を、最後に $ を付けましょう。 私の例がまずかったですね。 なお g オプションは不要です。
nikuatsu

2021/12/10 13:14

なるほど。仰る変更で実現できました。適切なご指摘、ご返答をどうもありがとうございました。
guest

0

ベストアンサー

「とりあえず、使い物になるかも?」レベルの案を回答します。

与えられた文字列strが、

  • 1バイトではない文字を一文字でも含むとき trueを返し、
  • そうでないとき false を返す

ような関数 hasMultiBytesChar(str) を作り、これを「全角文字を少なくとも一文字含む」ことと実用上等価であると見なす、という方針でどうでしょうか? これでいくなら以下のように書けます。

javascript

1function hasMultiBytesChar(str) { 2 return /[^\x00-\xff]/.test(str); 3}

これを使うと、hasMultiBytesChar(str)が返すブール値を反転した値は、strを構成する文字のすべてが1バイト文字(=\x00\xffの範囲内の文字)のときtrueになります。

以下、簡単なテストです。

参考までに、ご質問のような正規表現を自分が考えるときによく見返すのでブックマークしている質問の回答があります。

冒頭の関数 hasMultiBytesChar(str)はこのご回答にある

また制御文字を許容しても問題ないなら以下のような素朴な判定でよいこともあるでしょう。

[\x00-\xFF]

を拝借して、この文字セット外の文字を表す [^\x00-\xFF] を使っています。

もしかすると、[^\x00-\xFF]に該当するけれども画面上は半角の幅しかとらず、その文字は許容したい(≒全角とは扱わない)という特別な文字が出てくるかもしれませんが、そのときは個別対応する必要があります。冒頭、「とりあえず、使い物になるかも?」レベルの案とお伝えしているのは、そういった個別対応が発生することも意味しています。

投稿2021/12/10 12:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nikuatsu

2021/12/10 13:01

ご丁寧にありがとうございます。codepenのコードで意図した通りに動作致しました。そちらのコードでばっちりだと思います。 正規表現ですが、以下でも意図したように動作するように見えます。 /^[\x01-\x7E]+$/ ご提示の /[^\x00-\xff]/ と比べて、どういう文字で異なる結果になりえますか?
退会済みユーザー

退会済みユーザー

2021/12/10 13:50 編集

コメントありがとうございます。 > ・・・どういう文字で異なる結果になりえますか? について回答します。それを考えるには [\x00-\xFF] のほうが [\x01-\x7E] よりもマッチする範囲が広いので、 [\x00-\xFF]にはマッチするが、[\x01-\x7E]にはマッチしない文字 について検討すればよいということになります。 そのときに参照すべき資料は、\x80 以降〜 \xFF までも含むASCIIコード表、たとえばこれです。 https://www.ascii-code.com/ 上記のリンク先の下の方に The extended ASCII codes (character code 128-255) というセクションがあり、ここの表にあるものが先の検討すべき [\x00-\xFF]にはマッチするが、[\x01-\x7E]にはマッチしない文字 ということになります。 具体的にはたとえば § --- 文章の節を表す (\xA7) © --- コピーライトを表す (\xA9) é --- e +アキュート (\xE9) などです。これらは [\x01-\x7E] には含まれないので、これらのような \x80〜\xFF の範囲にある文字が1文字でも含まれた文字列は /^[\x01-\x7E]+$/ にマッチしないことになります。 それと \x00 も [\x00-\xFF]にはマッチするが、[\x01-\x7E]にはマッチしない文字 ですが、これはヌル文字と呼ばれC言語だと文字列の終端を表すバイトです。そのような特殊なものなので、文字セットの始まりが、\x00 であるか \x01 であるかは、それほど重く考えなくても実用上の相違はないと思われます。
nikuatsu

2021/12/10 13:55

たびたび大変丁寧なご返答を本当にありがとうございます。ちょっと驚いてます笑 パスワードで©なんて使いませんもんね。そちらのリンクをよく参照しながら適切な表現を模索してまいります。
guest

0

「アスキー文字を半角、それ以外を全角」と判断したいなら、一応これでいいかと思います。

JavaScript

1function isZenkaku(str) { 2 if (!str.match(/[\x01-\x7E]/)) { 3 return true; 4 } else { 5 return false; 6 } 7}

「全角か、半角カナ」が1つでもあったらfalse

なら、単に「アスキー文字を半角」ということですか?そうならisZenkakuではなくisHankakuが適切ですね。これでどうでしょう?

JavaScript

1function isHankaku(str) { 2 if (str.match(/^[\x01-\x7E]+$/)) { 3 return true; 4 } else { 5 return false; 6 } 7}

投稿2021/12/10 12:07

編集2021/12/10 12:27
miu_ras

総合スコア902

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

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

nikuatsu

2021/12/10 12:19

ありがとうございます。質問の例に対して以下実行しましたが、すべてfalseでした。 (21:07のご回答で実行) https://jsfiddle.net/1v7pxhaq/ (21:15のご回答で実行) https://jsfiddle.net/1v7pxhaq/1/ 1行目のコメントにありますが、前半3つは「全角か、半角カナ」が1つもないので true にしたいと思っています。
nikuatsu

2021/12/10 12:49

21:27のご編集ありがとうございます。「isHankaku」でできました。 実は私も以下「isOkPassStr」でちょうどできまして、 この2つについて異なる結果は想定できるでしょうか? https://jsfiddle.net/0vLwone9/ どちらもコンソールは意図したとおりの結果ですが、もし何か違いがありうるなら知りたいです。
guest

0

提案です。

以下のライブラリを利用してバイト列の文字コードを検出(detect)し、'ASCII' かどうかで判断してはいかがでしょうか。

encoding.js/README_ja.md at master · polygonplanet/encoding.js

なお、全角とおっしゃっていますけど半角カナは除外したいのでしょうか?

投稿2021/12/10 11:38

itagagaki

総合スコア8402

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

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

nikuatsu

2021/12/10 12:02

ライブラリありがとうございます。使えました。 https://jsfiddle.net/ch5vLnet/ そしてご指摘のように「全角か、半角カナ」でしたので質問を修正しまして、するとこのリンクの最後の「ア」が「UNICODE」となってしまう点で、やはり使えなそうでした…。しかし良いライブラリをご紹介いただき嬉しいです。
guest

0

文字数とバイト数を比較して不一致だったらNGにしたら?

投稿2021/12/10 11:38

takasima20

総合スコア7464

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問