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