RegExpでカンマの判定で疑問があります

このQ&Aのポイント
  • JavaScriptの入力チェックにおいて、正規表現を使用してカンマの判定を行っていますが、意図しない結果が返ってしまうことがあります。
  • 具体的には、カンマ「,」を入力した場合に、予期せずtrueが返ることがあります。
  • この問題の原因として、正規表現のパターンが、カンマのみを判定する条件になっていない可能性が考えられます。
回答を見る
  • ベストアンサー

RegExpでカンマの判定で疑問があります。

下記のようなjavascriptで入力チェックを考えています。 だいたい意図通りに動くのですが、「,」を入力した場合、想定はfalseなのですが、trueになってしまいます。 何か見落としがあるのでしょうか。また理由がわからないため、下記に指定していないのに意図せずにtrueになる文字がないか心配です。 どなたかアドバイスを頂けないでしょうか。 ※ いまはカンマだけ個別に比較して対応しています。 function test() { var str = sample8.input1.value; var check = new RegExp("[ !\"#$%&'()*+-./1023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz|~アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー゛゜。「」、・]"); if (str.match(check)) { alert("true"); } else { alert("false"); } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

たぶんそれは [a-c] (a から c まで)というものとして解釈されるから。 先頭に持ってくると影響がでない https://ideone.com/Fc1DH

_alias_
質問者

お礼

アドバイス有難うございます。 確かに先頭や後備に「-」を移動したら意図通りになりました。 あと1点疑問があるのですが、正規表現の説明ページを見ると下記の文字は「\」でエスケープするような記述がありました。 ただしなくても動いているのですが、javascriptでRegExpを使用する際は不要という認識でよいでしょうか。 ※ 「"」は「\」でエスケープは必要でした。 また上記では書いてませんでしたが、「\」は「\\\\」としないと「\」を入力した時にtrueになりませんでした。 もしよろしければこちらの疑問について教えて頂けると助かります。 \*+.?{}()[]^$-|/

_alias_
質問者

補足

また「]」などは「\\]」としないと駄目でした。「\\」としているのは「\」自体をエスケープしなければならないようなのですが、javascriptのRegExpクラスでエスケープしなければならない特殊文字の一覧が探せず、意図通りに動いているけれど「*」とか「.」を「\」でエスケープしなくてもいいのだろうかと悩んでいます。

その他の回答 (1)

回答No.2

>javascriptでRegExpを使用する際は不要という認識でよいでしょうか。 いや、俺が見落としたが、 >また上記では書いてませんでしたが、「\」は「\\\\」としないと「\」を入力した時にtrueになりませんでした。 コレが正解。

_alias_
質問者

お礼

お返事有難うございます。 一般にエスケープするべき文字(\*+.?{}()[]^$-|/など)は、javascriptのRegExpではエスケープしなくても意図通りの動きをするけど、エスケープしておいた方がよいということでしょうか? どこかでメタ文字でない文字に\でエスケープしても無視するという記述を見て、どれが本当にエスケープするべき文字なんだろうと・・・。 無視される文字にエスケープしても無駄だな~と思いまして・・・。 いまのところエスケープしないと意図通りに動かないのは「\」と「]」だけでした。

_alias_
質問者

補足

正規表現で[]の中は基本的にリテラルで扱われることを忘れていました。 例外的に\と]はエスケープが必要なことと、^$-は位置によってはリテラルとして扱われないことを思い出しました。 一通りの疑問が解決できました。有難うございました。

関連するQ&A

  • マッチするのにRegExp.lastIndexがundefinedになってしまいます!

    下のようなJavascriptで、 正規表現でマッチして、その位置を調べたいと思います。 しかし・・・マッチはするものの、 肝心の位置(RegExp.lastIndex)が、undefinedになります・・・。 var str = "ABCDEFG"; var rex = new RegExp("C", "i"); if (str.match(rex)) { document.write(RegExp.lastIndex+"文字目にマッチ。"); } else { document.write("マッチしません。"); } どうしてなんでしょうか?? ちなみに、実際のスクリプトはもっと長いものですがそこでうまくいかないので・・・。 今回のソースは、適当なサンプルをとってきて、それを編集したものです。 そのサンプルでも動かないので・・・。ブラウザがおかしいんでしょうか? 一応、Firefox3とGoogleChromeで確認しましたが、やはりundefinedです・・・

  • javaScriptで文字数制限

    フォームを作成していまして、alert指定を行っているのですが、一部半角数字も3桁設定ができなくて困っております。 数字は 100~999 までです。 下記のような記述となります。 どなたか 教えて下さい。宜しくお願い致します。 function WriterCheck() { var str = document.dataInputForm.no.value; if( str.match( /[^0-9]+/ ) ) { alert("ナンバーは半角数字3桁のみで入力して下さい。"); return false; } return true; }

  • javaScriptでアラート設定を教えてください。

    現在入力フォームを作成しておりますが、どうしても設定できない部分がありますので、教えてください。 下記のようなスクリプトを記述していますが、「ナンバー」のエラー表示部分に、半角数字3桁のみの入力設定を行いたいです。 それ以外を入力するとエラーが表示されるように設定を行いたいです。 宜しくお願い致します。 <script> function WriterCheck() { var str = document.dataInputForm.name.value; if( str.match( /[^A-Za-z\s.-]+/ ) ) { alert("名前は、半角英文字のみで入力して下さい。"); return false; } return true; } function CheckForm(dataInputForm) { var FormOK = false; if (dataInputForm.no.value == "") { FieldControl(dataInputForm.To, "ナンバーが未入力です。"); }else if (dataInputForm.title.value == "") { FieldControl(dataInputForm.To, "タイトル名が未入力です。"); }else if (dataInputForm.name.value == "") { FieldControl(dataInputForm.To, "名前が未入力です。"); }else { FormOK = true; } return FormOK; } function FieldControl(element, message) { alert(message); } </script>

  • new RegExp('[\\?&]' + hog

    下記、正規表現の意味を教えてください var x = new RegExp('[\\?&]' + hoge); ■調べてみた限りでは下記のような感じだと思うのですが… \? ・0文字または1文字の\ [\?] ・「0文字または1文字の\」の何れか [\?&] ・「0文字または1文字の\」の何れか、の最後にマッチ [\\?&] ・最初の\はエスケープ new RegExp('[\\?&]' + hoge); ・引数で受け取った文字列の最後の\をエスケープした内容にhogeを追加した文字列を返す

  • <input type="button">でボタンを押したときの処理

    ボタンをクリックしたらalertによって下記のような文字列、trueかfalseを返すようにしたいのです。 fulction hantei(){ if(str.length > 6){ document.write("true") } else{ document.write("false") } } あと、functionにはdocument.writeが使えないようなのですが、そうならばどのようにして表示させるのでしょう? よろしくお願いします。

  • ピリオド区切りで 4桁.2桁.2桁 という制限が出来なくて困っています

    ピリオド区切りで 4桁.2桁.2桁 という制限が出来なくて困っています。 テキストボックスに入力される文字列の形式を制限するために、Web上で見つけたサンプルソースを参考に、次のような形でJavascriptを挿入しました。 <script type="text/javascript"> /* ピリオドチェック */ function DotCheck() { var str = document.form01.yukoduki.value; if( str.indexOf( "." ) != 4) { alert("1234.56.78 のように、ピリオド2つで区切ってご記入下さい"); document.form01.kakuninbutton.disabled = true; // 送信ボタン無効化; return 1; } return 0; } /* 2つめのピリオドチェック */ function DotCheck() { var str = document.form01.yukoduki.value; if( str.indexOf( "." ) != 6) { alert("1234.56.78 のように、ピリオド2つで区切ってご記入下さい"); document.form01.kakuninbutton.disabled = true; // 送信ボタン無効化; return 1; } return 0; } /* 半角数字チェック */ function NumberCheck() { var str = document.form01.yukoduki.value; if( str.match( /[^0-9\s.]+/ ) ) { alert("半角数字と小数点のみで入力して下さい。"); document.form01.kakuninbutton.disabled = true; // 送信ボタン無効化; return 1; } return 0; } /* 全部チェック */ function AllCheck() { var check = 0; check += NumberCheck(); check += DotCheck(); check += DotDotCheck(T); if( check > 0 ) { return false; } return true; } </script> しかし、これだと、123.456.78 のように最初のピリオドまでと2つ目のピリオドまでの桁数は制限できますが、最後の桁は何桁でも入れ放題になってしまいます。 そこで、ピリオドのチェックを2つ入れるかわりに、まとめて桁数をチェックしようと次のようなソースをソースを考えたのですが、どうも私の知識不足で間違っているようで作動しません。 /*一括ピリオドチェック */ function DotDotCheck(T) { var str = document.form01.yukoduki.value; if( !str.match(/^?d(4).?d(2).?d(2)$/)) { alert("1234.56.78 のように、ピリオド区切りで4桁.2桁.2桁でご記入下さい"); document.form01.kakuninbutton.disabled = true; // 送信ボタン無効化; return 1; } return 0; } このソース、少し直すだけで、「ピリオド区切りで4桁.2桁.2桁になっていない場合はアラート」という目的を達成できないでしょうか? 直し方をお分かりの方がいらっしゃいましたらご教示頂きたく、どうかよろしくお願い致します。

  • -(ハイフン)_(アンダーバー)の先頭や末尾での使用不可にする正規表現の書き方

    JavaScriptの(正確にはJavaScriptのみというわけでは無く、どの言語にもいえることなのですが、)正規表現を使って、以下のような書き方を不許可にしたいのですが、なかなかうまくいきません。 絶対条件は、英数字のみです。 禁止にしたい:-hoge、hoge-、_hoge、hoge_ しかし、これはOK:ho-ge、ho_geなどなど........ ようするに、先頭末尾に-(ハイフン)_(アンダーバー)の使用を禁止にしたいのです。 但し以下の場合に使わなければなりません。 function check( str ) { if( str.match(/ここに制御文/) ) return false; else return true; } ↑ みたいな関数があって、下記のような処理をほどこしています。 if( !check( str ) ){ alert( strMsg ); return false; } わかりづらい内容かもしてませんが、 どなたご教授いただけば幸いです。 宜しくお願いいたします。

  • チェックしなくても、確認のウインドウがでる

    チェックしなくても、確認のウインドウがでてしまうのですが、どこがいけないのでしょうか <SCRIPT language=JavaScript> function SubmitCheck() } if (document.Order.elements[kiyaku_fn].value == ""){ return false; } else if (document.Order.elements[kiyaku_fn].value == "同意"){ alert("規約に同意して下さい"); return false; } var confirm_str = ""; confirm_str = "下記の事項をご確認ください。\n" + "正しければ、OKを押してください。\n" + "--------------------------------\n" + "規約:" + document.Order.elements[kiyaku_fn].value + "\n\n"; temp = 0; confirm_str += "--------------------------------\n"; if(confirm(confirm_str)){ return true; } else return false; return true; } </SCRIPT> <INPUT id=checkbox1 type=checkbox value="同意" name=checkbox1>規約

  • お問い合わせフォームの送信後クリア

    はじめてお問い合わせフォームを作りました。、 送信後、その入力内容をクリアしたいのですが、 どなたか教えていただけませんでしょうか? 現在、下記のような感じで、チェック後送信としています。 function check(){ var flag = 0; if(!document.form1.mail.value.match(/.+@.+\..+/)){ flag = 1; } if(flag){ window.alert('メールアドレスが正しくありません'); return false; // 送信を中止 } else{ return true; // 送信を実行 } } <FORM name="form1" method="post" action="id?Subject=Page_enquete" onSubmit="return check()">

    • ベストアンサー
    • CSS
  • 半角カタカナの入力チェックを作りたいです

    入力フォームで入力された文字に対して半角カタカナかチェックをしたいです。 function CheckHalfSizeKatakana($str) {  if (mb_ereg("^[ア-ン゛゜]+$",$str)) {    return true;  } else {    return false;  } } としたのですがうまくいきません。 PHP4です。

    • ベストアンサー
    • PHP

専門家に質問してみよう