• ベストアンサー

JavaScript 正規表現の()

こんにちは。 趣味でプログラミングをしているものです。 さっそくですが質問させていただきます。 var regexp = /^(?:button|input)$/i ; という定義がある場合(コロンもついています)、 その意味を教えてほしいのですが それと() その内部の? : についても 解説していただけないでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

一度正規表現についてなにか参考書のようなものを読んだ方がいいでしょう。 <script> var str="button"; alert(str.match(/^(?:button|input)$/i)[0]); alert(str.match(/^(?:button|input)$/i)[1]); alert(str.match(/^(button|input)$/i)[0]); alert(str.match(/^(button|input)$/i)[1]); alert(str.match(/^button|input$/i)[0]); alert(str.match(/^button|input$/i)[1]); </script> javascriptにおける正規表現は、マッチした値を配列としてもどします。 かっこで囲むと、マッチした値を1番目の要素に確認します。 (ちなみに、複数の括弧で囲むと2,3,4・・・と戻り値が増えていきます。) ただ、都合上、括弧でかこんでも1番目の要素を返したくない場合があります そのようなときに利用するのが(?:・・・)です 今回のケースだとかっこ自体を表記しなくても同じ結果がえられます

noname#173931
質問者

お礼

回答していただきありがとうございます。 お礼が遅れてしまいもうしわけありません。 解説していただけた内容と、 web上の正規表現のグループ化、後方参照に関する記事 http://www.web3d-club.net/jikken/JavaScript/regexp/group.htm によって、以前よりも理解を深めることができました。 web上の記事では、?:の使い方の解説が 見つからなかったのですが、 ?:を使った実例をひとつだけでも示していただけないでしょうか? amazonで正規表現の本を検索してみたら数千円するものが多かったので どうしようか迷っているのですが・・・ とにかく、貴重な時間をさいての回答、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JavaScript 正規表現について

    こんにちは、趣味でプログラミングをしているものです。 さっそくですが質問させていただきます。 下の正規表現パターンの意味について教えていただけないでしょうか? 見えにくいですが、:(コロン)もついています。 var rgexp = /^[\],:{}\s]*$/; よろしくお願いします。

  • 正規表現 数値 lastMatch

    JavaScriptの正規表現について。 下記の文字列(例)を、1行ずつ分割して、最後にマッチした数値(23, 59, 6)を取得したいです。 1: かおり(23) 2: 景子 (59) 3: さとみ(6) 私なりに下記を記述しましたが、取得する値が1,2,3となってしまいました。不具合。 inputは、上記の文字列です。 arr=input.split("\n"); //1行ずつ分割 for (var i = 0 ; i < arr.length ; i++){ arr[i].match(/[0-9]+/); input=input+RegExp.lastMatch; } お手数ですが、よろしくお願いいたします。

  • javascript クイズ

    こちらの http://okwave.jp/qa/q4105194.html 回答のNo.4の回答者様のソースコードなのですが <html> <head><style>.hid{display:none} .disp{display:block}</style></head> <body> <div id="s0">Start!!<input type="button" value="click" onClick="view();$('s0').className='hid';"></div> <div id="mn"></div> <div id="s1" class="hid"> Q1.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s2" class="hid"> Q2.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s3" class="hid"> Q3.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s4" class="hid"> Q4.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s5" class="hid"> Q5.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="hz" class="hid"> はずれでした! <input type="button" value="次に進む" onClick="nextq()"> </div> <div id="sk" class="hid"> 正解です! <input type="button" value="次に進む" onClick="nextq()"> </div> <script> var n=3; var q=5; var f=[]; var l=[]; var c=0; var cntc=0; window.onload=function(){ for(var i=0;i<n;i++){ do x=Math.floor(Math.random()*q)+1; while(f[x]) f[x]=true;l[i]=x; } } function view(){$('s'+l[c]).className='disp';$('mn').innerHTML=c+1+"問目";} function $(o){ return document.getElementById(o); } function hazure(){ $('hz').className='disp';} function seikai(){ $('sk').className='disp'; cntc++;} function nextq(){ $('sk').className='hid'; $('hz').className='hid'; $('s'+l[c]).className='hid'; if(++c>=n) owari(); else view(); } function owari(){ $('mn').innerHTML='正解数は、'+cntc; } </script> このままですと正解と不正解のボタンがそれぞれ一回ずつ押せてしまいます これを正解、不正解のどちらか一回しか押せないようにするにはどうすればよろしいでしょうか? よろしくお願いします。

  • javascriptについて

    <script type="text/javascript"> <!-- function df(){ var scr=100; if(document.ad.y.checked){ var sty=document.ad.a; for(var i=0;i<3;i++){ if(sty[i].checked){ scr+=20+10*i; break; } } } document.ad.ad1.value=scr; } --> </script> </head> <body> <form action="#" method="POST" name="ad"> <h4>毎日歯を磨きますか?</h4> <p><input type="checkbox" name="y" value="">はい<br> <input type="checkbox" name="n" value="">いいえ</p> <h4>何回</h4> <p>1回<input type="radio" name="a" value=""><br> 2回<input type="radio" name="a" value=""><br> 3回<input type="radio" name="a" value=""></p> <p>何<input type="text" size="20" name="ad1">点</p> <p><input type="button" value="配点" onClick="df()">&nbsp;<input type="reset" value="リセット"></p> </form> </body> </html> プログラムとしては成功しているんですが 解らないところが for(var i=0;i<3;i++) のところです。ラジオボタンに添え字を使って計算をしているという プログラムなのでしょうが たとえばlengthではなくあえて数字を入れてるのは 配列ではないからでしょうか? もう一点 formをつかって button やimage などを使うと 間違いを指摘してもデーターが流れて言ってしまいます。 return falseなど工夫はしてますが データーをtextに入っている文面を消さずに修正させるいい方法はありませんか お願いします。

  • javascriptのtextbox

    こんばんは。 <html> <body> <center> <br><br> <form name="fuji"> TEXT BOX<br> <input type="text" name="tex"> </form> <SCRIPT type="text/javascript"> var i; i="ABC" document.write("<input type='button' value='↑を変数iに代入' onClick='i=(document.fuji.tex);'>"); document.write("<br><input type='button' value='表示' onClick='document.write(i);'>"); </SCRIPT> </center> </body> </html> でテキストボックスの中身を表示させたいのですが、 上手くいきません。どうすればいいのでしょうか。 また、変数を使わずに直接テキストボックスの中身を 表示させる事はできるのでしょうか。 教えてください。

  • JavaScript(JScriptともいうのかな?)の正規表現につい

    JavaScript(JScriptともいうのかな?)の正規表現について質問です。 今、WindowsScriptHost(WSH)を利用するソースを読んでいるのですが、 app.charAt(app.length-1).match(/\S/) とか、 Urls(i).replace(/^feed:\/*(?:http(s)?:\/\/)?/, 'http$1://') のように、スラッシュで囲まれた表現が使われているのですが、これはどういう意味になるのでしょうか? Perlみたいに、ただ「/」で囲まれた文字列を正規表現の何かと判断しているのでしょうか? もしそうなら、解説されてる良いページを見つけられなかったので、詳しく説明されてるページなど教えていただけるとありがたいです。 宜しくお願いします。

  • javascriptで配列の重複判定の方法について

    似たような質問はありましたが、明確な答えが定まらないため質問させていただきます。 何卒、ご教授宜しくお願いします。 ■やりたいこと questions配列からanswerに乱数を入れて、それをvalueに入れたいのですが、 乱数を使うと、どうしても重複が発生してしまうため、重複を回避したいのですが、 どのように記述したらよいのでしょうか? 以下、ソースです。 <h2>問題:<span id="question_num"></h2> <input type="button" value="" id="answer_0" onclick="seikai(0)" /> <input type="button" value="" id="answer_1" onclick="seikai(1)" /> <input type="button" value="" id="answer_2" onclick="seikai(2)" /> <input type="button" value="" id="answer_3" onclick="seikai(3)" /> <script> var questions = [ { 'question': 'アメリカの首都は?', 'answer': ['ワシントン', 'ローマ', 'オタワ', '東京'], 'kotae': 'ワシントン' }, { 'question': 'イギリスの首都は?', 'answer': ['北京', 'ジュネーヴ', 'ロンドン', '東京'], 'kotae': 'ロンドン' }] var rnd; //seikai()で使う var answerNum = 4; function makequestion() { var currentNum = Math.floor(Math.random() * questions.length); document.getElementById('question_num').innerHTML = questions[currentNum]['question']; //ここから重複処理をどのようにして書けばよいかわかりません。 //例えば["東京", "ローマ", "東京", "オタワ"]などが返ってきてしまいます。 for ( var i=0; i<4; i++) { var ansrnd = Math.floor(Math.random() * answerNum); //選択肢用の乱数 var ans = questions[currentNum]['answer'][ansrnd]; //配列に入れる document.getElementById('answer_' + i).value = ans; } rnd = currentNum; } </script> 恐れ入りますが、宜しくお願い申し上げます。

  • 正規表現 testメソッドの結果が異なる件について

    環境:Windows2000 SP4 JScriptの質問なのですが、 正規表現オブジェクトのtest()が、グローバル?とインスタンスで異なる結果を出す為少々困惑しています。 具他的には、 // --- script -- var reg1 = /\s+/g; // グローバルなスコープを持つ正規表現オブジェクト? var reg2 = new RegExp( "\s+" ,"g" ); // インスタンス var target = "hello world"; // 判定対象 // テスト開始 WScript.Echo( "/\\s+/g.test( 'hello world' ) を3回。" ); for(var i=0; i< 3; i++) WScript.Echo( reg1.test( target ) ); WScript.Echo( "regExp('\\s+','g').test( 'hello world' ) を3回。" ); for(var i=0; i< 3; i++) WScript.Echo( reg2.test( target ) ); // --- end -- 実行した結果は、通常の正規表現インスタンスは思惑通りですが、 グローバルなスコープを持つインスタンスでは、結果が異なってしまいます。 直接記述した正規表現は、実行時にコンパイルされグローバルなスコープを持つインスタンスとして生成され、new() で作成したものは通常のスコープを持つインスタンスとして理解しています。 また、ヘルプには test() の実行はグローバル変数に何ら影響を及ぼさないと記述されています。 どこがおかしいのか分らないため、困惑しています。 ご教示いただければ幸いです。 また、質問箱的に何かおかしな点などありましたら、お手数ですがお知らせください。手直し、質問の取り消し等対処いたします。

  • JavaScriptについて

    JavaScriptでボタンゲームを作っているのですが、ボタンを押して正解だった場合、色が変わり押せなくなるようにしたいのですが、うまくいきません。どうしたら良いか困っています。 原因として「順番が正しいかどうか判定する」ところじゃないかと思います。 <script type="text/javascript"> //初期処理 var suji = "(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)"; var pushed = ""; // 押されたボタン管理 var startTime; // ゲーム開始時間を管理 var labelArray = suji.split(""); // 数字を一文字ずつ分割 $("startButton").onclick = start; nextGame(); // スタートボタンを表示する // 開始準備 function nextGame() { $("buttons").innerHTML = ""; $("startButton").style.visibility = "visible"; } // ゲーム開始 function start() { $("startButton").style.visibility = "hidden"; // 配列に数字を代入して順番をシャッフル arrayShuffle(labelArray); // ボタンを作る for (var i = 0; i < labelArray.length; i++) { var b = document.createElement("button"); b.innerHTML = labelArray[i]; b.onclick = button_clickHandler; $("buttons").appendChild(b); } pushed = 0; startTime = (new Date()).getTime(); } // ボタンが押された時の処理 function button_clickHandler(e) { var ch = e.target.innerHTML; // 押されたボタンの文字 // 順番が正しいかどうか判定する if (suji.substr(pushed, 1) != ch) { alert("違います。次は、" + suji.substr(pushed,1)); } else { $("buttons").innerHTML=""; arrayShuffle(labelArray) for(var i = 0; i < labelArray.length; i++) { var b = document.createElement("button"); b.innerHTML = labelArray[i]; b.onclick = button_clickHandler; $("buttons").appendChild(b); } e.target.disabled = true; e.target.style.backgroundColor = "#909090"; pushed++; } if (pushed == labelArray.length) { var now = new Date().getTime(); var tm = Math.floor((now - startTime) / 1000); var min = Math.floor(tm % 3600 / 60); var sec = tm % 60; alert("おめでとうございます。\n"+ min + "分" + sec +"秒でクリアです!"); nextGame(); } } // 配列をシャッフルする function arrayShuffle(bs) { for (var i = 0; i < bs.length; i++) { var r = Math.floor(Math.random()*bs.length); var tmp = bs[i]; bs[i] = bs[r]; bs[r] = tmp; } } function $(id) { return document.getElementById(id); } </script>

  • javascriptのarertについて

    最近javascriptの勉強を始めたのですが, var i = 3; arert = ("i"); とか var j =[1, 2, 3] arert = ("j[2]") などしますと、数字ではなくて、iなどの文字が表示されてしまいますよね? またfor(i=0; i<5;i++){ var sample_i = i } などしても多分sample0~sample_4まで定義したことにはなりませんよね? そこで質問なんですが、javascriptではこういった文字と数字をどうやって判別してるんでしょうか? また上の例のコードを書き直してくれたら嬉しいです。

MFC-J837DN PC win10無線不可
このQ&Aのポイント
  • PC側のWindows10更新で、MFC-J837DNプリンタが認識されなくなった件について教えてください。
  • Windows10のバージョンを21H1に変更したら、MFC-J837DNプリンタがPCから認識されなくなりました。印刷ができなくなってしまいました。対処方法を教えてください。
  • MFC-J837DNプリンタがWindows10バージョン21H1のPCで認識されなくなり、印刷ができなくなりました。対処方法を教えてください。
回答を見る