2

長年のユーザー、初めての質問者。正規表現は非常に新しいものです。私はInDesignでの生活を楽にしようとしているデザイナーなので、これが簡単なものである場合はしばらくお待ちください:)

マスターファイルからテンプレートファイルにページをプルするスクリプトに取り組んでいます。これらのマスターページの一部には、最終ファイルを印刷用にPDFにエクスポートするときに使用されるレイヤーがあります。最終ファイルが電子メールにエクスポートされるときに、他のレイヤーが使用されます。したがって、誰かが電子メール用に保存するオプションをチェックした場合、印刷レイヤーを非表示にし、電子メールレイヤーを表示したいと思います。簡単ですが、コードを関数として合理化して、変数として「print」または「email」を指定できるようにしたいと思いました。そうすれば、スクリプトはそれを「print」を含むすべての変数に一致させます。正規表現の領域。

var openDocument = app.documents.item(0);
var LayerLength = openDocument.layers.length;

wordToMatch = "print";

for (i=0;i<LayerLength;i++)
{
    myRegEx = new RegExp(wordToMatch,"i");

    str = openDocument.layers.item(i).name;
    if (str.search(myRegEx) >= 0)
    {
        openDocument.layers.item(i).visible = true;
    }
}

したがって、これは実際に機能します。それは私がやりたいことをします(まだ関数に入れていませんが、そこに着きます)。「印刷」が含まれているレイヤーを見つけて、表示します。

しかし、これは私には理想的ではなかったようです。次のように、正規表現を1回定義してから、forループで複数回使用する方が理にかなっていると思いました。

wordToMatch = "print";
myRegEx = new RegExp(wordToMatch,"i");

for (i=0;i<LayerLength;i++)
{
    str = openDocument.layers.item(i).name;

    if (str.search(myRegEx) >= 0)
    {
        openDocument.layers.item(i).visible = true;
    }
}

ただし、これは最初のレイヤーで実行することになっていることだけを実行し、後続のレイヤーと一致させることはできません。

どうしてこれなの?ここで根本的なことを誤解しているような気がしますが、それが何なのか知りたいです。

ありがとう、ブレンダン

4

1 に答える 1

4

正規表現にはlastIndexプロパティがあります。一致が見つかった場合、最後のインデックスは一致後の次の文字を指し、すべての一致が見つかった後でのみ0にリセットされます。

これは、同じ文字列で次の一致を見つけることができるようにするためです。最初の一致のみを検索しているため、ループ内でlastIndexを自分でリセットします。

for(i= 0; i<LayerLength; i++){
    myRegEx.lastIndex= 0;
    str= openDocument.layers.item(i).name;
    if(str.search(myRegEx)>= 0){
        openDocument.layers.item(i).visible= true;
    }
}
于 2012-03-16T19:27:52.057 に答える