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

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

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

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

Q&A

解決済

2回答

1423閲覧

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

SugiuraY

総合スコア317

JavaScript

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

0グッド

2クリップ

投稿2017/01/22 16:04

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

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オブジェクトは保有(または参照)しているのでしょうか?

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

Javascript

1<script> 2var p =/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/gi; 3var str = "始めはhttp://www.wahaha.mmm.com/です"; 4str +="お次はHTTP://www.aaa-dddd.com/です"; 5result=p.exec(str);//code1 6document.write(result); 7document.write(RegExp.leftContext);//code2 8</script>

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

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

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

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

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

guest

回答2

0

ベストアンサー

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/22 23:56

raccy

総合スコア21735

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

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

SugiuraY

2017/01/23 13:47

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

0

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

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

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

投稿2017/01/22 22:28

maisumakun

総合スコア145183

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

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

SugiuraY

2017/01/23 13:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問