- ベストアンサー
[1-3].jpgを1jpg 2pg ・・・のようにしたい
- 質問者は、[1-3].jpgというアドレスを連番にしたいと考えています。
- splitを使用して[1-3]を取り出し、joinで連結する方法を知りたいと述べています。
- 質問者はフリーソフトではなく、スクリプトの学習をしたいと述べています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、正規表現の解釈に関してですが、*****で囲まれている内容でほぼ正解です。 但し、注意して頂きたいのは、今回は一致する文字列を切り出して後で使うために使用している表現がある、ということです。 もし、展開部を含む、という条件だけでマッチを行うのならば、 \[ \d+ \- \d+ \] で十分なことに注意してください。(どこで分けるのかを明確にするためにわざと空白を入れて書きました) 展開部の前、および後の文字列を後から使いたいがために、^(.*)や、(.*)$等の表現を入れているわけです。 それから、()で囲む、ということには、RegExp.$xに代入させて後から使う、という意味がありますが、 グループ化する、という意味はありません。 単に1文字以上の数字、という場合には\d+という表現で十分です。 match()の動作だけを理解するのならば、nullに関して深入りしなくとも理解することができます。 文字列strと正規表現regに対して、str.match(reg)は、 strの中からregで表された表現にマッチする文字列を探し、そのような文字列があればその文字列を、 なければnullという特殊な量を戻り値とする、というように決められています。 従って、 str.match(reg) != null という式は、regで表された表現がstrの一部にあれば真、なければ偽となります。 (この文はmatch()の戻り値と、nullという量を比較する、という式です) なぜこのような判定が必要なのか、という話をいたしますと、 RegExp.$xは「最後にマッチしたときの」結果を格納することになっているからです。 従って、my1()を2回以上実行する場合、本当にマッチしたのかをきちんと判定しないと、 2回目は式の書き方がおかしくてマッチしなかったとしても、1回目の結果を使ってURLを書き出してしまう、ということになります。 これを避けるためにマッチしたかどうかを分岐の条件にしています。 また、nullに関してですが、正確に理解するためには、JavaScriptで、文字列がどのように記憶されているのかを知る必要があります。 C等を勉強して、ポインタの概念を理解しておられるなら分かりやすいと思います。 JavaScriptで、変数にオブジェクトを記憶する場合、変数には、記憶するオブジェクトが「メモリ上のどこにあるか」を書き込むことになっています。 例えば、 a = "abc"; とした場合には、メモリ上のどこかに"abc"なる文字列を記憶するStringオブジェクトが作られ、変数aにはその場所が記録されます。 nullというのは、この場所を表す情報の1つで、「どこの場所も表していない」という特別な意味を持ちます。 特に、""とnullは異なる物であることに注意してください。 a = ""; とした場合、aに記憶されているのは空の文字列("")を表すStringオブジェクトの場所です。 従ってa.length()は(""の長さが0なので)0となりますが、 a = null; とした場合にa.length()を実行しようとするとエラーとなります。 これはaがどの場所も表していないため、その長さを計算する、という操作の対象が存在しないからです。 (厳密にはこの言い方は間違いですが...)
その他の回答 (2)
- zzzzzz
- ベストアンサー率61% (70/113)
「仕様」と申し上げたのは展開に関しての仕様の意味だったのですが... 仮に、 ・展開部は"["+(数値)+"-"+(数値)+"]"の形式で表されるものとする ・1つの展開可能URL中には展開部は1つしか含まれないものとする という仕様で作ってみます。 但し、2番目の仕様はコードを見やすくするためだけのものですので、 比較的簡単に除くことができます(RegExp.$1に対してmatchを再実行、を再帰的に行う)。 展開処理は、表示とは無関係な処理のため、通常は展開だけを行うルーチンを書く方が良いのですが、 今の場合は、そのようにすると無駄な文字の格納が増えますので、1つのルーチンで展開・表示の両方を行うことにします。 <input type="button" value="クリック" onClick="my1(document.forms['form1'].text1.value)"> のように呼ばれるとした場合、 function my1(str) { if (str.match(/^(.*)\[(\d+)\-(\d+)\](.*)$/) != null) { var win = window.open(); for (var i=Number(RegExp.$2); i<=Number(RegExp.$3); i++) { win.document.write(RegExp.$1 + i + RegExp.$4 + "<BR>\n"); } } else { alert("式が展開可能ではありません。"); } } のようにすれば可能です。 ここで、^(.*)\[(\d+)\-(\d+)\](.*)$という正規表現は、上で定義した仕様1に合致するかどうかをチェックするために使用しています。 正規表現については#1の参考URLを参照してください。 この結果として、例えばstr == "http://www.aaa.com/xxx[1-100].jpg"だった場合、 RegExp.$1 == "http://www.aaa.com/xxx" RegExp.$2 == "1" RegExp.$3 == "100" RegExp.$4 == ".jpg" となります。 つまり、RegExpオブジェクトのメンバ$1に展開部の前の文字列が、$4に後の文字列が、 $2と$3に展開範囲が代入されます。 これを利用してあとはループを回しているだけです。 ただし、strが仕様通りのフォーマットになっていない場合にはstr.match()がnullを返しますので、これで処理を分けています。
補足
ありがとうございます。 ちょっと分からないところがあるので質問します。 ^(.*)\[(\d+)\-(\d+)\](.*)$ の意味ですが、翻訳はこんなぐあいでいいでしょうか。 ***************************************** ^(.*) 行頭はどんな文字でも何文字でもよい。 \[ [という文字を含む文字であること、 (\d+) 0~9までの数字を含んでいること、何桁でもよい。 \- - という文字を含む文字であること。 \] ] という文字を含む文字であること。 (.*)$ 文末はどんな文字でも何文字でもよい。 ( )で囲まれているものはあとで、RegExp.$1 RegExp.$2 .... で取り出すことができる。 ******************************************* でも( )ってグループ化するってのがあったのですがそれとは違うのでしょうか?例えば(\d+) は 0~9までの数字という意味の\d 1文字以上という意味の+ この二つの条件を合体させるという意味で( )が使われていると思いました。 それから、他にもわからないところがあります。 if (str.match(/^(.*)\[(\d+)\-(\d+)\](.*)$/) != null) の意味です。 str.match(■)の意味ですが、 ”■と同じものを文字列が格納されているstrから抽出する。” は分かったのですが、 !=null の意味がわからないです。 nullって 偽という意味なのかしら?? 0? 何もないという意味??str.match(■)!=null ということは、マッチするものが無いということ?? あれれ という状態です。 if(条件式){ 条件成就の場合 }else{ 条件が成り立たない場合 } は分かっているのですが。 もう少しで理解できそうなのです。 教えてください。 ご面倒かけて申し訳ないです。 今 http://tohoho.wakusei.ne.jp/wwwjsreg.htm を見ながら考えてます。
- zzzzzz
- ベストアンサー率61% (70/113)
仕様をもっと厳密に書いていただかないと具体的なコードは示せませんが、 RegExpオブジェクトを使用すると良いと思いますよ。
補足
***************************************** <HTML> <HEAD> <TITLE>URLを展開</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- Hide script from old browser ここにスクリプトを記入 // end Hiding --> </SCRIPT> </HEAD> <BODY BGCOLOR="#D0D0D0"> <FORM NAME="form1"> <input type="text" name="text1"value="ここにURLを入れてボタンを押すと新しいウィンドウに表示されます。" size="60"> <input type="button" value="クリック" onClick="my1()"> </FORM> http://www.aaa.com/xxx[1-100].jpgを<br> <br> http://www.aaa.com/xxx1.jpg <br> http://www.aaa.com/xxx2.jpg <br> http://www.aaa.com/xxx3.jpg <br> .<br> .<br> .<br> http://www.aaa.com/xxx100.jpg <br> という具合に表示します。<br> イリアというダウンロードソフトの「URLの展開」という<br> のと同じ機能です。 </BODY> </HTML> ***************************************** こんばんは。 テキストボックスにURLを入力しボタンを押せば 展開してくれるようにしたいのです。 分かりにくい説明でもうしわけないです。
お礼
ご丁寧に教えていただきありがとうございます。 なんとかわかりました。 正規表現って便利なものなのですね。 いろいろお手数掛けました。