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

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

ただいまの
回答率

88.13%

インスタンスを使用する場合と直接Objectを使用する場合?

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 913

score 249

お世話になります。
下記のコードについて、理解ができない点がございます。

code1>>
result=p.exec(str)
これは、
var p =/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/gi;
というコードが実際には
var p = new RegExp(/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/gi);
であり、そのインスタンスpがプロトタイプを辿ってexecメソッドを呼び出している
と理解しております。

code2>>
理解ができないのは
document.write(RegExp.leftContext);//code2
です。

⒈まずせっかくpインスタンスを作ったのに、直接RegExpオブジェクトにアクセスするのでしょうか?静的プロパティというのが関連しているというところまで調べることができたのですが、詳しい内容は理解ができませんでした。。

2.実際にはp.leftContextでは正規表現でマッチする前までの文字列は取得できないのですが、インスタンスからこのleftContextプロパティにはアクセスできないのはなぜでしょうか?

3.pインスタンスは/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/giというリテラル(引数?情報?)を知っているので、
result=p.exec(str);//code1
document.write(result);
の結果、正規表現にマッチする内容を配列で返してくれるのは非常に理解できるのですが、一方でオブジェクトのRegExpは/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/giを知らない(引数?として持っていない)はず、加えてstrについても何も伝達していないはずなのに
document.write(RegExp.leftContext)で
対象の文字列や正規表現を認識しているのはなぜでしょうか?
pで作成するようなインスタンスの場合、元のオブジェクト等に影響を与えないようにインスタンスを作成していると理解しているのですが、なぜまたはどのようにして、インスタンスしか知りえない情報をRegExpオブジェクトは保有(または参照)しているのでしょうか?

また、素人のため、うまく質問できていないかもしれず、申し訳ございませんが、
不明な点からあれば、ご指摘いただければ、補足させていただきます。
よろしくお願い申し上げます。

<script>
var p =/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/gi;
var str = "始めはhttp://www.wahaha.mmm.com/です";
str +="お次はHTTP://www.aaa-dddd.com/です";
result=p.exec(str);//code1
document.write(result);
document.write(RegExp.leftContext);//code2
</script>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

RegExpはRegExpコンストラクタです。pはRegExpオブジェクトであり、別の表現をすると、RegExpコンストラクタのインスタンスです。なお、JavaScriptではコンストラクタはオブジェクトであり、また、関数でもあります。

RegExp.leftContextはRegExpコンストラクタのプロパティです。これは「最も直前に正規表現を使ってマッチするかどうかの検索をしたときに、マッチした部分の左側が自動的に入る」というプロパティになっています。つまり、result=p.exec(str)が「正規表現を使ってマッチするかどうかの検索」にあたり、これが「最も直前に」あたります。この検索でのマッチするのは"http://..."ですので、そのマッチ部分よりも左側、つまり、マッチする前の部分を抜き出すことができます。

このようにコンストラクタには、個々のインスタンスとは独立して操作するためのプロパティやメソッドが用意されています。今回の例では「最も直前に」というのが動作の仕様にあり、その前の検索がどのようなRegExpオブジェクトであったかは関係が無い動作になります。これらは、インスタンスとは結びついていないため、インスタンスから呼び出すことはできません。

なお、RegExp.leftContextは非標準の機能であり、各ブラウザで実装はされていますが、使用することは非推奨となっています。ですが、これは元々Perlの正規表現には備わっている機能であるため、Perlと同じように実装したのだと思われます。(同じような物がRubyにもありますし、これもPerlからの導入です。Perlの正規表現は実用的でかつよくできていて、また、広く広まっていることもあり、JavaScriptを含めた多くの実装で参考にされています)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/23 22:47

    非常にわかりやすいご説明、ありがとうございます。
    RegExpのleftContextのプロパティについて、その仕様を理解することができました。
    御礼申し上げます。

    キャンセル

+5

正規表現オブジェクトはイミュータブルであって、オブジェクト自体が情報を持つ、ということができません。

ということで、マッチに関する詳しい情報が必要なら、.exec()メソッドの返り値を使うのが正式です。

RegExp.leftContextなど、RegExp自体のプロパティから結果を取るのは、(SugiuraYさん自身も疑問に思っているように)別オブジェクトとなっていてコードの挙動もすっきりしないし、実は(殆どのブラウザで対応しているけど)正式なEcmaScriptの仕様には含まれない機能なので、避けた方がいいでしょう(MDN)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/23 22:48

    ご回答ありがとうございます。
    利用が推奨されない旨、承知をいたしました。

    キャンセル

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

  • ただいまの回答率 88.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る