长期使用者,第一次询问者;对正则表达式来说很新。我是一名设计师,试图让我在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;
}
}
但是这只能在第一层上做它应该做的事情,然后它无法匹配任何后续层。
这是为什么?我觉得我在这里误解了一些基本的东西,我想知道那是什么。
谢谢, 布伦丹
答案 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;
}
}