• 締切済み

RegExp n番目のrightContext

RegExp n番目のrightContext をしたいのですがどう書いたら良いでしょうか。 例えば var hoge = ieobj.document.all(0).innerHTML; hoge.match(/html/igm); var result = RegExp.rightContext; で出力されるresultは最後にhtmlにマッチしたものが出ると思います マッチ対象が複数あった場合指定することは可能でしょうか 実際はエラーになりますが RegExp.$n.rightContext の様な事がやりたいのです

みんなの回答

  • 4017B
  • ベストアンサー率73% (1306/1777)
回答No.2

色々と実験してみましたところ… 修飾子の "g" を付けたら一番最後のマッチング結果、付けない場合は最初のマッチング結果が返されるだけで、PHPやPerlとかの一般的な正規表現マッチとは違いますね…!PHPとかの preg_match_all() とかでマッチさせた場合は結果が配列で戻されて、[$n] みたいに自由に中身を取り出せるのですが。 どうもJavascriptに実装されてる正規表現エンジン自体が貧弱というか、一般的な他プログラム言語のモノとは違って出来ない事がかなり多いみたいなので、"g"修飾子を付けて全てのマッチング結果を返す様に指定しても、その結果を配列として全取得出来る方法は最初の回答例の様な場合のみで、これ少しでも複雑な ()パターンによるマッチングを指定しても無視されてる?みたいな感じの結果しか返してくれませんでした。 なので「"RegExp.rightContext" を使って直前の正規表現マッチング結果の n番目を指定して取り出す事は出来ない」が答えとなりますね…前述の通り、今現在の仕様では正規表現による高度な文字列処理をJavascriptに期待するのは難しい模様。残念! P.S. もしかしたら jQuery でなら自分の知らない高度な正規表現による文字列処理が出来るかも?

  • 4017B
  • ベストアンサー率73% (1306/1777)
回答No.1

何か書いてある例文の意味がよく分からないのですが… var my_str = 'my age is 24 years old, but my mother is 18 years.', my_exp = /[0-9]+/g, re = my_str.match(my_exp); とりあえず上記の記述例の場合、変数 re の中身は ["24","18"] となり配列として返されます。配列ですので中身を参照したい場合も普通に… alert( re[0] ); ~で「24」と表示されます。re[1] ならば「18」です。何も rightContext とかマニアックな事をしなくても普通に正規表現でマッチさせた結果を取得すればOKだと思います。

popepon
質問者

お礼

ご回答有難うございます 少し気になったのですが 得たい値はマッチ結果より右の文字列であって マッチする文字列そのものでは無いのですが ご掲示頂いた例で可能でしょうか? 自分が例に出したのは htmlソースで検索かける感じで 挙動としてはgetElementsByName等とほぼ同様です (厳密には違いますが)

関連するQ&A

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

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

  • マッチするのに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です・・・

  • ECMAScript:RegExp.exec()メソッドについて

    初めて投稿します。 var re = new RegExp("A", "g"); var res = "ABABAB".match(re); document.writeln(res); 上記のように、文字列に対してString.match()メソッドを使用して正規表現(gフラグつき)とマッチングを行うと結果は 「A,A,A」 とマッチしたAが全て配列として帰ってきますが、 var re = new RegExp("A", "g"); var res = re.exec("ABABAB"); document.writeln(res); 上記のように、文字列に対してregExp.exec()メソッドを使用して正規表現(gフラグつき)とマッチングを行うと結果は 「A」 とマッチしたAが1つしか帰ってきません。 ECMA 262 3rd Editionの仕様では、 (http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/) RegExp.exec()メソッドも、String.match()メソッドと同様に、regExpのオブジェクトを生成時に"g"フラグを付加して、ある文字列とマッチングすると、マッチするものが1件以上存在する場合、新しい配列にマッチしたもの全てを各要素に格納して値を返す動作を行うと(多分?)書かれているみたいなのですが、RegExp.exec()メソッドは、どのブラウザで操作を実行しようとしても、マッチした文字が1件しか帰ってきません。。。 教えていただきたいのは、 『何故、RegExp.exec()メソッドはマッチした文字が1件しか帰ってこないか?』です。 いろんなサイトを調べてみたのですが、どうしてRegExp.exec()メソッドがこのようなふるまいを起こすか断定できませんでした。。。 どなたか、JavaScriptやECMAScriptのロジカル的な部分で詳しい方がいらっしゃいましたら、 よろしくお願いいたします。m(__)m

  • innerHTMLを使ってID要素の内容を変えたい

    innerHTMLを使ってID要素の内容を変えたいのですが、 下記のような使い方はできないのでしょうか? var changeTEXT = document.all("hoge2").innerHTML; できない場合、これに変わるようなものがありましたら教えていただけたら、うれしいです。 よろしくお願いします。 <html> <head> <script language="JavaScript" type="text/javascript"> <!-- var changeTEXT = document.all("hoge2").innerHTML;         function change1_ID(){ if(document.all){ document.all("hoge1").innerHTML = changeTEXT } if(document.getElementById){ document.getElemntById("hoge1").innerHTML = text1 } } //--> </script> <style type="text/css"> <!-- #hoge1 { margin: 0px; padding: 0px; height: 600px; width: 600px; } #hoge2 { margin: 0px; padding: 0px; height: 600px; width: 600px; } --> </style> </head> <body> <div id="hoge1" onclick="change_ID()"> ここの内容を変えたい</div> <div id="hoge2"> ここに入力されたHTMLの内容をhoge1の内容にしたい</div> </body> </html>

  • Apend前のElementの中のElement

    var div = document.createElement('div'); div.innerHTML="hogehoge<div id='hoge'>aaa</div>"; とし、 このdivの中のelementをID指定で取得したいです。 document.body.appendChild(div); とした後なら、 document.getElementById('hoge') で取得できるのですが、 appendChildしたくないです。 ご名案ありましたら、ご教授ください。宜しくお願いいたします。

  • 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"); } }

  • innerHTMLの初期値

    下記のソースがあります。 <SCRIPT TYPE="text/javascript"> <!-- function Change(id){ if(document.all){ document.all.result.innerHTML = document.all(id).innerHTML; }else if(document.getElementById){ document.getElementById('result').innerHTML = document.getElementById(id).innerHTML; } } //--> </SCRIPT> <a href="#" onClick='Change("ih2"); return false'>前</a><br> <a href="#" onClick='Change("ih3"); return false'>次</a><br> <div id="ih2" style="display:none">テキスト1</div> <div id="ih3" style="display:none">テキスト2</div> <br> <span id="result"></span> 前、次のリンクで表示されるテキストが切り替わるようにしているのですが、 クリックする前の段階では何も表示されていない状態です。 そこで、クリックする前でもid="ih2"の「テキスト1」が表示されている状態にしたいのですが、 なかなか出来ません。 functionの前に document.all.result.innerHTML = document.all.ih2.innerHTML; と記述してみましたが駄目でした。 id="ih2"の値を読み込んで表示させたいのですが、 何か良い方法はありませんか。

  • なぜfunc()で動き、funcで動かないのか。

    以前良く似た質問をしましたが、また疑問点が出たので質問します。 前回は、以下のコードでなぜonload = funcで動作し、onload = func()では動作しないのかをお聞きしました。 var img = new Image(); window.onload = function() { img.onload = func; } function func() { (省略) } その結果、funcだと関数を指定し、func()だと関数の返り値を代入するという答えを頂きました。 しかし自分で実験してみたところ、以下のコードでは逆の結果になりました。 window.onload = function() { document.getElementById("result1").onload = result1; document.getElementById("result2").onload = result2(); } function result1() { document.getElementById("result1").innerHTML = "result1"; } function result2() { document.getElementById("result2").innerHTML = "result2"; } <div id="result1"></div> <div id="result2"></div> onload = result2()の方は期待通りの結果が得られましたが、onload = result1ではdiv要素に文字列は挿入されませんでした。onloadによって実行される関数をfunc形式で指定したのになぜ動作せず、func()形式のもののみ動作したのでしょうか? あと蛇足になりますが、このようなコードも試してみましたが、どちらもうまくいきませんでした。 window.onload = function() { document.getElementById("result1").onload = result1; document.getElementById("result2").onload = result2(); } function result1() { this.innerHTML = "result1"; } function result2() { this.innerHTML = "result2"; } <div id="result1"></div> <div id="result2"></div> 両方のfunction内のthisはdocument.getElementById("result1")またはdocument.getElementById("result2")を指すのではないのでしょうか?

  • FireFox正規表現のstickyフラグの意味

    FireFox3から、正規表現にstickyフラグなるものが追加されました。この有用性がわかりません。 MDNではサンプルが示されていますが、そのサンプルのフラグを「g」フラグに書き換えても挙動は全く同じであり、有用性の説明にはなっていないものと思われます。仮に正規表現のパターンが「/^(\S+) line\n?/」だったとしても「mg」フラグ時と変わりません。 yフラグはmgフラグ指定時と全く同じなのでしょうか。違う部分があるのでしょうか?もし違う部分があるのならyフラグの意味や、mgフラグとの違い・有用性がわかるサンプルを教えてください。 よろしくお願いします。 RegExp - JavaScript | MDN https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/RegExp var text = "First line\nsecond line"; var regex = /(\S+) line\n?/y; var match = regex.exec(text); console.log(match[1]); // "First" を出力します console.log(regex.lastIndex); // 11 を出力します var match2 = regex.exec(text); console.log(match2[1]); // "Second" を出力します console.log(regex.lastIndex); // "22" を出力します var match3 = regex.exec(text); console.log(match3 === null); // "true" を出力します ※「print」は明らかなミスだと思われるため「console.log」に書き換えています。

  • javascriptの条件文

    スマホにタッチした時の値を取得するスクリプトです。 よくわからないまま作成してますが、ご勘弁下さい。 <script type="text/javascript"> window.document.addEventListener("touchstart", function(event){ event.preventDefault(); var result = document.getElementById("result"); result.innerHTML = "clientX:"+ event.touches[0].clientX+ "<br>" + "clientY:"+ event.touches[0].clientY; }, true); window.document.addEventListener("touchmove", function(event){ event.preventDefault(); var result = document.getElementById("result"); result.innerHTML = "clientX:"+ event.touches[0].clientX+ "<br>" + "clientY:"+ event.touches[0].clientY; }, true); window.document.addEventListener("touchend", function(event){ event.preventDefault(); var result = document.getElementById("result"); result.innerHTML = ""; }, true); ここまでは正常。 値を取得した、Yを下記のようにしたのですが、 500以上になってもロケーションが実行されません。 間違いなく構文が間違っているのですが、数時間格闘したのですが、わからないので すみませんが、教えて頂けると有難いです。 num = event.touches[0].clientY; if (num >= "500") { location.href = "https://www.google.co.jp/"; } </script>