Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在for循环外部定义的正则表达式不起作用_Javascript_Regex_Adobe Indesign - Fatal编程技术网

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

Javascript 在for循环外部定义的正则表达式不起作用,javascript,regex,adobe-indesign,Javascript,Regex,Adobe Indesign,长期用户,第一次询问;对正则表达式非常陌生。我是一名设计师,试图让我在InDesign中的生活更轻松,所以如果这是一个简单的设计,请耐心:) 我正在编写一个脚本,将页面从主文件拉到模板文件中。其中一些母版页具有将最终文件导出为PDF打印时使用的图层;将最终文件导出为电子邮件时,将使用其他层。因此,如果有人选中了保存电子邮件的选项,我希望打印层隐藏,电子邮件层显示。很简单,但我想将代码简化为一个函数,这样我就可以将“print”或“email”指定为变量,然后脚本将其与任何包含“print”的变量

长期用户,第一次询问;对正则表达式非常陌生。我是一名设计师,试图让我在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;
    }
}
var openDocument=app.documents.item(0);
var layerllength=openDocument.layers.length;
wordToMatch=“打印”;
对于(i=0;i=0)
{
openDocument.layers.item(i).visible=true;
}
}
所以,这确实有效。它做了我想要它做的事情(还没有把它放到函数中,但我会做到的)。它会找到带有“打印”的图层,然后使其可见

不过,这对我来说并不理想。我认为定义一次正则表达式,然后在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;
    }
}
wordToMatch=“打印”;
myRegEx=新的RegExp(wordToMatch,“i”);
对于(i=0;i=0)
{
openDocument.layers.item(i).visible=true;
}
}
但这只执行它在第一层上应该执行的操作,然后它无法匹配任何后续层

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

谢谢,
Brendan

正则表达式具有lastIndex属性- 找到匹配项时,最后一个索引指向匹配后的下一个字符, 仅在找到所有匹配项后重置为0

这样您就可以在同一字符串中找到下一个匹配项- 由于您只查找第一个匹配项,请在循环中自己重置最后一个索引

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;
    }
}
for(i=0;i=0){
openDocument.layers.item(i).visible=true;
}
}

正则表达式具有lastIndex属性- 找到匹配项时,最后一个索引指向匹配后的下一个字符, 仅在找到所有匹配项后重置为0

这样您就可以在同一字符串中找到下一个匹配项- 由于您只查找第一个匹配项,请在循环中自己重置最后一个索引

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;
    }
}
for(i=0;i=0){
openDocument.layers.item(i).visible=true;
}
}

这是有效的。所以非常感谢:)但我仍然不太明白这里的原则,所以如果你有时间跟进,我将不胜感激!我取出了您添加的行,并在for循环的右大括号之前添加了一个警报,以显示myRegEx.lastIndex。在第一次迭代之后,它是9(图层名为“仅用于打印”,这样才有意义),但在每隔一次迭代之后,它是-1。如果我理解正确,不是每次都是9点吗?如果不使用
/g
,这有什么关系?Quote from MDN
仅当正则表达式使用“g”标志指示全局搜索时,才设置此属性。因此,它应该没有任何效果。我不知道,但它起了作用。这可能只是InDesign处理JS的方式与Web的不同吗?我不知道这两者之间的差异到底有多大,这是有效的。所以非常感谢:)但我仍然不太明白这里的原则,所以如果你有时间跟进,我将不胜感激!我取出了您添加的行,并在for循环的右大括号之前添加了一个警报,以显示myRegEx.lastIndex。在第一次迭代之后,它是9(图层名为“仅用于打印”,这样才有意义),但在每隔一次迭代之后,它是-1。如果我理解正确,不是每次都是9点吗?如果不使用
/g
,这有什么关系?Quote from MDN
仅当正则表达式使用“g”标志指示全局搜索时,才设置此属性。因此,它应该没有任何效果。我不知道,但它起了作用。这可能只是InDesign处理JS的方式与Web的不同吗?我知道的还不够多,无法完全了解两者之间的差异。