WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:IE4.0スクリプトエラーについて

0:[投稿] さもはん [MAIL] [2002/09/30 15:10 ][環境:WIN+IE ASP]

以前おせわになりました、さもはんです。

環境win95でIE4.0でのスクリプトエラーについての質問なのですが、
文字を置換しようとして
(スラッシュがあったらそれを取り除こうというもの)
いるのですが、
win2000のIE5.0では正常に動くのですが,
IE4.0ですと

スクリプトエラー

正規表現の構文エラー
ライン 84
文字  3
コード 0

と出てしまいます。
しかし、使っているものは
IE4.0対応のものだけなので、
84行目のどこが悪いのかいまいち分かりません.


よろしければご教授願えないかと思います。

よろしくおねがいいたします。


jsファイルのソース

//管理区分設定期間チェック
84行目  rgexp = new RegExp("/", "g");
     SelectedFrom = parseInt("20"+document.GBGC0100.SetkikanFrom.value.replace(rgexp , ""));
 SelectedTo = parseInt("20" + document.GBGC0100.SetkikanTo.value.replace(rgexp , ""));

日にちをチェックしているのですが,
見た目テキストボックスには02/09/30
というふうに表示され、それを20020930といった形にしたいので
スラッシュを取り除いて頭に20をくっつけています。


1:[関連] さもはん [2002/09/30 15:55 ]

いろいろ試してみまして,rgexpの中が”///g”といった形になることが分かりました。
しかし、RegExp("\/", "g");とやっても同じエラーがでてしまうので,こういった場合はどうしたらよいのでしょうか?


2:[回答] JTR [2002/09/30 16:09 ]

ためしに、RegExpを使わず。
SelectedFrom = parseInt("20"+document.GBGC0100.SetkikanFrom.value.replace(/\//g , ""));

で、どうですか?
なお、検証はしてません。ごめん。


3:[回答] さもはん [2002/09/30 16:50 ]

回答ありがとうございます。

とりあえず#>>2をコピペしてみたところスクリプトエラーが
おきなくなり、正常に動作しました.

私の中で""はつけなくていいのかな?という疑問が
あったのですが、つけてみても特に動きに変わりはありませんでした.

しかし、どうしてRegExp("\/", "g");だといけなかったのかがよく分からないのですが。

もし良かったら教えていただけると幸いです。
よろしくお願いいたします。


4:[回答] JTR [2002/09/30 17:43 ]

>しかし、どうしてRegExp("\/", "g");だといけなかったのかがよく分からないのですが。

実は、私も、前前から知りたいと思っているのです...。
わかる方、いますか?


5:[回答] ween [2002/09/30 19:41 ]

RegExp('\/','g') と書いても、RegExp('/','g') と同じことです。
'\/' と '/' の評価結果は同じですから。

\ を正規表現内のエスケープ文字として
RegExp コンストラクタに渡したいならば、
\ 自体をエスケープして '\\' としなければダメです。
\d や \w も '\\d', '\\w' としなければ上手くいかないはずです。

というわけで、やるなら RegExp('\\/','g') でしょう。


6:[回答] JTR [2002/09/30 20:17 ]

weenさん、いつもありがとうございます。
長年の謎が解けました。

ついでに、以下を教えていただけますか。
matchだと上手くいくのですが、RegExpだとNGです。

re = new RegExp('\\d+', 'g');
//xx = "01:23:45".match(/\d+/g);
xx = re.exec("12:34:56");
alert(xx.length); // → 3
alert(xx[0]); // → "12"
alert(xx[1]); // → "34"
alert(xx[2]); // → "56"


7:[回答] ma-to [2002/09/30 21:08 ]

フォワードスラッシュが「特殊な文字」としても扱われるとすれば、バックスラッシュそのものが直前に現れなければならない。リテラルで
    /\//
とするのと、文字列の実引数をコンストラクタに渡すのとでは見た目に同じものを書いてよいわけがないと考えると思うのだが、いかがなものか。

RegExp コンストラクタの最初の実引数は文字列だから、バックスラッシュは少なくとも 2 つは必要ではないか。一般的具体的には、
    2 ^ (引用符の入れ子の深さ) [個]
必要ではないか。
引用符の入れ子の深さが単に 1 つの場合は 1 つのバックスラッシュでもヨシとする比較的新しいスクリプトエンジンでも、引用符の入れ子を深くすると同じエラーを出したと記憶しているが、どうだったか。何にせよバックスラッシュを上記の個数羅列しておいて正しく動作しているからわざわざ確かめようとも思わない。

結局のところ、
    new RegExp('\\/', 'g')
が正しいと思う。もしこれでも出来なければあきらめなければならない (紛れも無いバグということになる)。


8:[回答] ma-to [2002/09/30 21:10 ]

>>5
イヤ〜ん。
7 は削除希望。


9:[回答] P初心者 [2002/09/30 21:21 ]

http://www.microsoft.com/japan/developer/library/script56/js56jsmthexec.htm
> 配列の要素 0 には一致結果全体が、要素が 1 から n には、*一致結果の中に副次的に含まれる一致の内容*が格納されます。この処理は、グローバル フラグ (g) が設定されていない場合の match メソッドの処理と同じです。


10:[回答] ma-to [2002/09/30 22:06 ]


>>9

ECMA 262
    15.5.4.10
    15.10.6.2
    15.10.7.5

ところが、IE はグローバルで 15.10.6.2 実行時の 15.10.7.5 にバグがあるから、検証には使えない。


11:[回答] ma-to [2002/10/01 00:34 ]


>>6

グローバルフラッグが付くと match がどのように手を抜くのか、または、手を抜かない exec が返してくるパターンマッチの詳細情報をどう取得すればよいか、の例。

//String.prototype.match
    var
        s = '123-456-789',
        r = new RegExp('\\d(\\d(\\d))','g'),
        m = s.match(r);
    alert(m);

//RegExp.prototype.exec
    var
        s = '123-456-789',
        r = new RegExp('\\d(\\d(\\d))','g'),
        e;
    while ((e=r.exec(s))!=null)
        alert(e);


12:[回答] JTR [2002/10/01 10:32 ]

ma-toさん、いつもありがとうございます。
matchとexecの違い、大体理解できました。
matchは、一気に配列に展開され、execは、マッチ毎に展開される。


13:[完了] さもはん [2002/10/03 11:08 ]

すみません!!
完了にするのをすっかり忘れてしまっておりました.
まだまだ不慣れなのですが、、
とても勉強になりました。ありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World