在for循环之外定义的正则表达式不起作用

时间:2012-03-16 18:55:34

标签: javascript regex adobe-indesign

长期使用者,第一次询问者;对正则表达式来说很新。我是一名设计师,试图让我在InDesign中的生活更轻松,所以请耐心等待,如果这很容易:)

我正在编写一个脚本,将页面从主文件中拉出到模板文件中。其中一些母版页具有在将最终文件导出为PDF以进行打印时要使用的图层;将最终文件导出到电子邮件时,将使用其他层。因此,如果有人检查了保存电子邮件的选项,我希望隐藏打印图层并显示电子邮件图层。很容易,但我想简化代码作为一个函数,所以我可以指定“打印”或“电子邮件”作为变量,然后脚本将匹配任何具有“打印”的变量。正则表达领域。

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;
    }
}

所以,这确实有效。它做了我想要它做的事情(还没有把它放在一个函数中,但我会到达那里)。它找到了包含“print”的图层,然后使它们可见。

但这对我来说似乎并不理想。我认为定义正则表达式然后在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;
    }
}

但是这只能在第一层上做它应该做的事情,然后它无法匹配任何后续层。

这是为什么?我觉得我在这里误解了一些基本的东西,我想知道那是什么。

谢谢, 布伦丹

1 个答案:

答案 0 :(得分:3)

正则表达式具有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;
    }
}